AndroidでビットマップのRGB値を取得したいのですが、今のところできません。私の目的は、ビットマップの各ピクセルの RGB 値を取得することです。Androidまたはその他の特定の機能はありますか?
colorMatrix()
また、関数が必要なのだろうか?
それは私のプロジェクトにとって非常に重要です。
AndroidでビットマップのRGB値を取得したいのですが、今のところできません。私の目的は、ビットマップの各ピクセルの RGB 値を取得することです。Androidまたはその他の特定の機能はありますか?
colorMatrix()
また、関数が必要なのだろうか?
それは私のプロジェクトにとって非常に重要です。
Bitmap#getPixel(x, y)
色の値とアルファ値が埋め込まれた int を返します。
int colour = bitmap.getPixel(x, y);
int red = Color.red(colour);
int green = Color.green(colour);
int blue = Color.blue(colour);
int alpha = Color.alpha(colour);
これは少し遅いかもしれませんが、&0xff の使用による混乱を解消するために:
Java の int は 32 ビットであるため、各ピクセルの (A)RGB 値は 4 バイトにパックされます。つまり、ARGB_8888 モデルで値 R(123)、G(93)、B(49) = FF7B 5D31 を持つピクセル。Alpha = FF、R = 7B、G = 5D、B = 31 です。ただし、これは int として -8692431 として格納されます。
したがって、-8692431 から緑の値を抽出するには、ご存じのとおり、5D を 8 ビット右にシフトする必要があります。これにより、00FF 7B5D が得られます。そのため、その値だけを取得すると、Green 値として 16743261 が残ります。したがって、その値をマスク 0xFF (0000 00FF に相当) でビット演算すると、00FF 7B5D が 0000 005D に「マスク」されます。したがって、5D (または 93 10 進数) のグリーン値を抽出しました。
必要な 2 バイトを最下位として公開するために値がすべてシフトされているため、抽出ごとに同じマスク 0xFF を使用できます。したがって、以前に提案されたコードは次のとおりです。
int p = pixel[index];
int R = (p >> 16) & 0xff;
int G = (p >> 8) & 0xff;
int B = p & 0xff;
より明確になる場合は、次の同等の操作を実行できます。
int R = (p & 0xff0000) >> 16;
int G = (p & 0x00ff00) >> 8;
int B = (p & 0x0000ff) >> 0;
簡潔にするために、余分な 0 は削除でき、次のように記述できます。
int R = (p & 0xff0000) >> 16;
int G = (p & 0xff00) >> 8;
int B = p & 0xff;
ただし、各ピクセルをわずか 2 バイトとして格納する RGB_555 など、RGB チャネルの精度が異なる別のカラー モデルを使用できることに注意してください。したがって、抽出を実行する前に、ビットマップが使用しているモデルを確認する必要があります。これは、色が異なる方法で保存される可能性があるためです。
これが私がその値を取得しようとしている方法です。bitmap.getPixel() を使用して、対応するビットマップを整数配列で取得します。ビットごとの回転操作を使用して、RGB 値を取得します。
int[] pix = new int[picw * pich];
bitmap.getPixels(pix, 0, picw, 0, 0, picw, pich);
int R, G, B,Y;
for (int y = 0; y < pich; y++){
for (int x = 0; x < picw; x++)
{
int index = y * picw + x;
int R = (pix[index] >> 16) & 0xff; //bitwise shifting
int G = (pix[index] >> 8) & 0xff;
int B = pix[index] & 0xff;
//R,G.B - Red, Green, Blue
//to restore the values after RGB modification, use
//next statement
pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
}}
ステートメントレス用の1つ:D
imagen.getPixels(pix, 0, picw, 0, 0, picw, pich);
for (i = 0; i < pix.length; i++) {
r = (pix[i]) >> 16 & 0xff;
g = (pix[i]) >> 8 & 0xff;
b = (pix[i]) & 0xff;
}