web-dev-qa-db-ja.com

AndroidデバイスのビットマップからRGB値を取得するにはどうすればよいですか?

AndroidでビットマップのRGB値を取得したいのですが、これまではできません。ビットマップの各ピクセルのRGB値を取得することが目的です。Androidまたは他の何か??また、colorMatrix()関数が必要なのだろうか?それは私のプロジェクトにとって非常に重要です。ありがとう。

29
barzos

これは少し遅れる可能性がありますが、&0xffの使用による混乱を解消するには:

In Java intsは32ビットであるため、各ピクセルの(A)RGB値は4バイトにパックされます。つまり、R(123)、G(93)の値を持つピクセル、B(49) = FF7B ARGB_8888モデルの5D31。Alpha= FF、R = 7B、G = 5D、B =31。ただし、これは-8692431のようにintとして保存されます。

したがって、-8692431からGreen値を抽出するには、ご存じのように5Dを8ビット右にシフトする必要があります。これにより、00FF 7B5Dが得られます。したがって、その値を取得するだけであれば、グリーン値として16743261が残ります。したがって、ビット単位でその値を0xFFのマスク(0000 00FFと同等)で使用すると、00FF 7B5Dが0000 005Dに「マスク」されます。そこで、5D(または10進数で93)のGreen値を抽出しました。

抽出ごとに同じマスク0xFFを使用できます。これは、必要な2バイトを最下位として公開するために値がすべてシフトされているためです。したがって、以前に提案されたコード:

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チャネルのさまざまな精度で保存する代替カラーモデルを使用できることに注意してください。そのため、抽出を実行する前に、ビットマップが使用しているモデルを確認する必要があります。色は異なる方法で保存される可能性があるためです。

25
QuackSaysHe

Bitmap.getPixel(x, y)は、カラー値とアルファ値が埋め込まれたintを返します。

int colour = bitmap.getPixel(x, y);

int red = Color.red(colour);
int blue = Color.blue(colour);
int green = Color.green(colour);
int alpha = Color.alpha(colour);
25
Cobbles

これが私がその価値を得ようとしている方法です。 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;
                 }}
18
yogsma

ステートメントレス用: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;
    }
7
Wolf

任意のビットマップカラー処理

ここでは、ピクセルintから色の成分を抽出するさまざまな Color メソッドについて読むことができます。

ビットマップにフィルターを適用し、バイト配列を返すことができます。それ以外の場合は、この例をforループに切り詰め、ピクセルをロールスルーしてバイト配列を生成できます。

private byte[] rgbValuesFromBitmap(Bitmap bitmap)
{
    ColorMatrix colorMatrix = new ColorMatrix();
    ColorFilter colorFilter = new ColorMatrixColorFilter(
            colorMatrix);
    Bitmap argbBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(),
            Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(argbBitmap);

    Paint paint = new Paint();

    Paint.setColorFilter(colorFilter);
    canvas.drawBitmap(bitmap, 0, 0, Paint);

    int width = bitmap.getWidth();
    int height = bitmap.getHeight();
    int componentsPerPixel = 3;
    int totalPixels = width * height;
    int totalBytes = totalPixels * componentsPerPixel;

    byte[] rgbValues = new byte[totalBytes];
    @ColorInt int[] argbPixels = new int[totalPixels];
    argbBitmap.getPixels(argbPixels, 0, width, 0, 0, width, height);
    for (int i = 0; i < totalPixels; i++) {
        @ColorInt int argbPixel = argbPixels[i];
        int red = Color.red(argbPixel);
        int green = Color.green(argbPixel);
        int blue = Color.blue(argbPixel);
        rgbValues[i * componentsPerPixel + 0] = (byte) red;
        rgbValues[i * componentsPerPixel + 1] = (byte) green;
        rgbValues[i * componentsPerPixel + 2] = (byte) blue;
    }

    return rgbValues;
}