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のコピー(複製)を得ることができます。