1

私はimage_sourceそれがいくつかの画像とimage_new—一時的なビットマップを含むソースビットマップです

私はこのコードを実行します。これによりimage_source、アナグリフの背景レイヤーになります。

int [] pixel = {0x0, 0x0, 0x0};
int [] image_params = {image_source.getWidth() - 2 * anaglyph_amplitude, image_source.getHeight()};
Bitmap image_new = Bitmap.createScaledBitmap(image_source, image_params[0], image_params[1], false);
for(int i = 0; i < image_params[0]; ++i)
    for(int j = 0; j < image_params[1]; ++j) {
        pixel[0] = image_source.getPixel(i, j);
        pixel[1] = image_source.getPixel(i + 2 * anaglyph_amplitude, j);
        pixel[2] = pixel[0] + pixel[1] % 0x10000 - pixel[0] % 0x10000;
        image_new.setPixel(i, j, pixel[2]);
    }
image_source = Bitmap.createBitmap(image_new);
image_new = null;

次にimage_source、キャンバスに描画されます(キャンバスに描画することはできません)。

問題は、このプログラムがスマートAndroidデバイスで1000x1000サイズの画像を処理するのに約5秒かかることです。

ビットマップピクセルを実行する他の方法はありますか?

4

4 に答える 4

1

別の微調整。内側のループでは、pixel[1] などに配列を使用する理由はありません。3 つの int、p0、p1、および p2 があります。

編集が追加されました

私は Swing ほど Android に詳しくありませんが、Android の Bitmap には、Raster に似た「一度に大量のピクセルを取得する」方法があることを期待していました。します。

ここでビットマップメソッドのjavadocsリンクを使用する必要があると思います

public void getPixels (int[] pixels, int offset, int stride, int x, int y, int width, int height)

メモリに余裕がある場合は、1,000,000 個すべてを一度に取得します。

于 2012-01-04T07:09:57.637 に答える
1

スニペット コードのパフォーマンスが向上しました。それがあなたにとって十分かどうかはわかりません。

最初の変更

pixel[2] = pixel[0] + (pixel[1] & 0xFFFF) - (pixel[0] & 0xFFFF);

それ以外の

pixel[2] = pixel[0] + pixel[1] % 0x10000 - pixel[0] % 0x10000;

-

pixel[1] = image_source.getPixel(i + (anaglyph_amplitude<<1), j);

それ以外の

pixel[1] = image_source.getPixel(i + 2 * anaglyph_amplitude, j);
于 2012-01-04T06:46:49.797 に答える
0

Here is solution: I get array of pixels and worked with it.

int [] pixel = {0x0, 0x0, 0x0};
int [] pixels_old, pixels_new;
int [] params = {image_source.getWidth(), image_source.getHeight()};
int [] image_params = {image_source.getWidth() - 2 * anaglyph_amplitude, image_source.getHeight()};
pixels_old = new int[params[2] * params[3]];
pixels_new = new int[image_params[0] * image_params[1]];
image_source.getPixels(pixels_old, 0, params[2], 0, 0, params[2], params[3]); 
image_source = null;
for(int i = 0; i < image_params[0]; ++i)
    for(int j = 0; j < image_params[1]; ++j) {
        pixel[0] = pixels_old[i + j * params[2]];
        pixel[1] = pixels_old[i + (anaglyph_amplitude<<1) + j * params[2]];
        pixel[2] = pixel[0] + (pixel[1] & 0xFFFF) - (pixel[0] & 0xFFFF);
        pixels_new[i + j * image_params[0]] = pixel[2];
    }
pixels_old = null;
image_source = Bitmap.createBitmap(pixels_new, image_params[0], image_params[1], Bitmap.Config.ARGB_8888);
pixels_new = null;
于 2012-01-05T04:33:22.833 に答える
0

の計算をキャッシュして、2 * anaglyph_amplitude反復ごとに計算する必要がないようにすることができます。

于 2012-01-04T08:06:04.643 に答える