Android NV21到灰度打印

时间:2017-02-14 02:40:34

标签: android grayscale yuv

我从onPreviewFrame(byte []数据,相机相机)成功{...} 将NV21提取Y为灰度值,但我要打印灰度值,灰度值应为0~255但是根据黑色区域应为0但是打印出来-16777216,我怎么能看到0~255 PS.I知道ARGB_8888是32位,所以要提取A黑区,如果0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

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 个答案:

答案 0 :(得分:1)

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

循环示例:

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

-16777216ARGB_8888格式打印出来 -167772160xFF000000的{​​{3}}代表 较高的字节,等于0xFF是alpha通道(不透明的像素 - 没有透明度) 所有三个颜色通道都是零。

Alpha通道是黑色 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000的原因 以ARGB_8888格式,不透明黑色为:11111111 00000000 00000000 00000000

对于灰色像素,三个颜色通道具有相同的值:R = G = B.
您的代码:pixels[i] = 0xff000000 | p<<16 | p<<8 | p;p的值与R,G和B重复,并将Alpha通道设置为0xFF(十进制为255)。
有关详细信息,请参阅two's complement格式。

因此,您只需打印p的值。