2017-02-14 73 views
0

我已經成功從onPreviewFrame(byte [] data,camera camera){...} 請問NV21會提取Y的灰度值,但是我想打印灰度值,灰度值應該是0〜255但是根據黑色區域應該是0但是打印出-16777216,我怎樣才能看到0〜255 PS.I知道ARGB_8888是32位,所以要提取A黑色區域如果0000 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

我想,你所需要做的是打印p而不是pixels[i]

環例如:

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

-16777216ARGB_8888格式被打印出來。
-167772160xFF000000two's complement表示。
較高的字節,等於0xFF是alpha通道(不透明像素 - 沒有透明度)。
所有三個顏色通道都是零。

alpha通道是黑色的原因是不是0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
in ARGB_8888格式,不透明黑色是:11111111 00000000 00000000 00000000

對於灰色像素三個顏色通道具有相同的值:R = G = B.
您的代碼:的p於R,G和B pixels[i] = 0xff000000 | p<<16 | p<<8 | p;重複值,並設置alpha通道0xFF(255十進制)。
有關詳細信息,請參閱ARGB格式。

因此,您可以打印p的值。