我从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);
}
答案 0 :(得分:1)
我想,您需要做的就是打印p
而不是pixels[i]
。
循环示例:
for(int i = 0; i < size; i++) {
p = data[i] & 0xFF;
Log.d("pixels=", String.valueOf(p));
}
-16777216
以ARGB_8888
格式打印出来
-16777216
是0xFF000000
的{{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
的值。