[Android] Bitmapピクセル操作(getPixels / setPixels)

| トラックバック(0) |

Bitmapのピクセル操作をするには、
android.graphicsパッケージBitmapクラスのgetPixel() / setPixel()を呼び出します。
また、getPixels() / setPixels()を呼び出すことで、複数のピクセルを操作することもできます。

具体的なサンプルコードは、以下のとおりです。

// Bitmap bitmap; // ビットマップがARGB32bitの場合
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int pixels[] = new int[width * height];

bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        int pixel = pixels[x + y * width];

        pixels[x + y * width] = Color.argb(
                Color.alpha(pixel),
                0xFF - Color.red(pixel),
                0xFF - Color.green(pixel),
                0xFF - Color.blue(pixel));
    }
}

bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

この例では、ARGB32bit形式のBitmapに対して、
getPixels()を呼び出し、全ピクセルを(pixels)配列へ取得後、
forループ内で、各ピクセル(32bit値)のRGBを反転したピクセルを配列へ戻し、
最後に、setPixels()を呼び出し、変更した配列をBitmapへ反映させています。

上記では、全ピクセルを一括で配列へ取得していますが、
全ピクセルが必要でなければ、以下のように1行毎にget/setしてもよいでしょう。
このあたりは、画像処理のアルゴリズムとか、使用メモリ容量、速度などを考慮して書いてみてください。

int pixels[] = new int[width];

for (int y = 0; y < height; y++) {
    bitmap.getPixels(pixels, 0, width, 0, y, width, 1);

    for (int x = 0; x < width; x++) {
        int pixel = pixels[x];
        // ...
    }

    bitmap.setPixels(pixels, 0, width, 0, y, width, 1);
}

最後になりますが、
setPixels()は、Bitmapが編集不可(つまり、Bitmap.isMutable()がfalse)の場合、
IllegalStateExceptionの例外がスローされます。

ちなみに、編集不可のBitmapから、編集可能なBitmapを得るには、
copy(Bitmap.Config config, boolean isMutable)
を呼び出します。

第1引数が、Bitmapピクセルの並びで、32bitARGBを得るには、Bitmap.Config.ARGB_8888を指定します。
また、第2引数が編集可能かどうかですので、trueを設定することで、編集可能なBitmapのコピー(複製)を得ることができます。

トラックバック(0)

トラックバックURL: http://mt.adakoda.com/mt-tb.cgi/61

Android Advent Calendar 2011

2012年2月

      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29