2017-02-14 1 views
0

onPreviewFrame(byte [] data、camera camera){...}から成功しました NV21はグレー値としてYを抽出しますが、グレー値を出力します。 0〜255しかし、黒の領域によると、0になりますが、-16777216が出力されます。0〜255を見るには PS。ARGB_8888は32ビットなので、黒い領域を抽出することがわかります。0000 0000 0000 0000 0000 0000 0000 0000 0000AndroidのNV21とグレースケールの印刷

public Bitmap applyGrayScale(byte [] data, int width, int height) { 
    int[] pixels = new int[width * height]; 
    int p; 
    int size = width*height; 

    for(int i = 0; i < size; i++) { 
     p = data[i] & 0xFF; 
     pixels[i] = 0xff000000 | p<<16 | p<<8 | p; 
     Log.d("pixels=", String.valueOf(pixels[i])); 
    } 
    return Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888); 
} 

enter image description here

答えて

1

あなたがする必要があるのは、pixels[i]の代わりにpの印刷です。

ループの例は:

for(int i = 0; i < size; i++) { 
    p = data[i] & 0xFF; 
    Log.d("pixels=", String.valueOf(p));  
} 

-16777216ARGB_8888フォーマットでプリントアウトされます。
-16777216two's complementの表現で0xFF000000です。
上位バイトは、アルファチャンネル(透明でない不透明なピクセル)です。0xFFになります。
3つのカラーチャンネルはすべてゼロです。

黒がでない理由は、アルファチャンネルが0000 0000 0000 0000 0000 0000 0000 0000 0000 0000である理由です。
ARGB_8888フォーマットでは、不透明な黒は11111111 00000000 00000000 00000000です。 R = G = Bの
は、コード:グレー画素について

3つのカラーチャネルが同じ値を有するR、G及びBにppixels[i] = 0xff000000 | p<<16 | p<<8 | p;重複値、及び0xFF(10進数で255)にアルファチャンネルを設定します。
詳細はARGBフォーマットを参照してください。

pの値を印刷するだけで済みます。

関連する問題