0

700x700 RGB24 TIF ファイルを読み取り、ディスプレイ メモリに配置するこの作業コードがあります。値を割り当てる行はpixelARGB非常に効率が悪いようです。このコードは画面を再描画するのに 3 ~ 4 秒かかります。シフトと論理和を回避し、バイト値を 32 ビット ワード内の正しい位置に配置する方法はありますか? 他の言語では、「オーバーレイ変数」や「バリアント レコード」などを使用してこれを行いました。Java でこれを見つけることができません。ありがとうございました。

for (y=0; y<700; y++) { // for each line
    i = 0;
    for (x=0; x<700; x++) { // for each dot
        red = lineBuf[i++] & 0xFF;
        green = lineBuf[i++] & 0xFF;
        blue = lineBuf[i++]& 0xFF;
        pixelARGB = 0xFF000000 | (red << 16)| (green << 8) | blue;
        this_g.setPixel(x + BORDER, y + BORDER, pixelARGB);
    }
    size=is.read(lineBuf,0,2100);
}
4

1 に答える 1

1

BitmapTIFF イメージ データ バッファをより効率的に変換する方法が少なくとも 1 つあります。

1.int[]ピクセル コピーの代わりに配列を使用します。

各ピクセルを個別に計算する必要がありますが、それらをint[]配列に設定します。それはsetPixel()あなたのすべての時間を取っている機能です。

例:

final int w = 700;
final int h = 700;
final int n = w * h;
final int [] buf = new int[n];
for (int y = 0; y < h; y++) {
    final int yw = y * w;
    for (int x = 0; x < w; x++) {
        int i = yw + x;
        // Calculate 'pixelARGB' here.
        buf[i] = pixelARGB;
    }
}
Bitmap result = Bitmap.createBitmap(buf, w, h, Bitmap.Config.ARGB_8888);

2. ループ内でサイズを変更します。

これはあまりありそうにありませんがImageView、結果画像の宛先がソース画像よりも小さいことがわかっている場合 (質問では 700x700)、forループ内でサイズを変更してパフォーマンスを大幅に向上させることができます。

あなたがしなければならないことは、目的の画像ピクセルをループし、ピクセルを計算しxyソース画像から必要な値を計算し、pixelARGBそれらのピクセルのみの値を計算し、より小さなint[]配列に入力し、最後により小さなBitmap. 多くの。もっと早く。

デスティネーション ピクセルごとに最も近い 4 つのソース ピクセルの自作キュービック補間を使用して、サイズ変更の品質を向上させることもできますが、これは表示目的では不要であることがわかると思います。

于 2013-03-27T19:45:54.843 に答える