gpt4 book ai didi

android - 从android相机的NV21格式中提取黑白图像

转载 作者:IT老高 更新时间:2023-10-28 21:47:33 30 4
gpt4 key购买 nike

我在 Google 上做了一些搜索,但找不到关于这种格式的足够信息。它是相机预览的默认格式。谁能建议有关它的良好信息来源以及如何从具有该格式的照片/预览图像中提取数据?更具体地说,我需要提取的黑白图像。

编辑:似乎该格式也称为 YCbCr 420 Semi Planar

最佳答案

我开发了以下代码来将 NV21 转换为 RGB,并且可以正常工作。

/**
* Converts YUV420 NV21 to RGB8888
*
* @param data byte array on YUV420 NV21 format.
* @param width pixels width
* @param height pixels height
* @return a RGB8888 pixels int array. Where each int is a pixels ARGB.
*/
public static int[] convertYUV420_NV21toRGB8888(byte [] data, int width, int height) {
int size = width*height;
int offset = size;
int[] pixels = new int[size];
int u, v, y1, y2, y3, y4;

// i percorre os Y and the final pixels
// k percorre os pixles U e V
for(int i=0, k=0; i < size; i+=2, k+=2) {
y1 = data[i ]&0xff;
y2 = data[i+1]&0xff;
y3 = data[width+i ]&0xff;
y4 = data[width+i+1]&0xff;

u = data[offset+k ]&0xff;
v = data[offset+k+1]&0xff;
u = u-128;
v = v-128;

pixels[i ] = convertYUVtoRGB(y1, u, v);
pixels[i+1] = convertYUVtoRGB(y2, u, v);
pixels[width+i ] = convertYUVtoRGB(y3, u, v);
pixels[width+i+1] = convertYUVtoRGB(y4, u, v);

if (i!=0 && (i+2)%width==0)
i+=width;
}

return pixels;
}

private static int convertYUVtoRGB(int y, int u, int v) {
int r,g,b;

r = y + (int)(1.402f*v);
g = y - (int)(0.344f*u +0.714f*v);
b = y + (int)(1.772f*u);
r = r>255? 255 : r<0 ? 0 : r;
g = g>255? 255 : g<0 ? 0 : g;
b = b>255? 255 : b<0 ? 0 : b;
return 0xff000000 | (b<<16) | (g<<8) | r;
}

这张图有助于理解。 YUV420 NV21

如果你只想灰度图像更容易。您可以丢弃所有 U 和 V 信息,而只获取 Y 信息。代码可以是这样的:

/**
* Converts YUV420 NV21 to Y888 (RGB8888). The grayscale image still holds 3 bytes on the pixel.
*
* @param pixels output array with the converted array o grayscale pixels
* @param data byte array on YUV420 NV21 format.
* @param width pixels width
* @param height pixels height
*/
public static void applyGrayScale(int [] pixels, byte [] data, int width, int 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;
}
}

只需创建您的位图:

Bitmap bm = Bitmap.createBitmap(pixels, width, height, Bitmap.Config.ARGB_8888);

其中像素是您的 int [] 数组。

关于android - 从android相机的NV21格式中提取黑白图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5272388/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com