最近做的项目涉及到NV21转RGBA,网上找到的方法黑白图像显示正常,但是加上伪彩后颜色不对,折腾了好几天还是不行。最后只好研究YUV原理,才弄明白网上的算法有疏漏,修改后再运行程序,图像的颜色终于显示正常了,这里把最终的算法记录一下,希望能给大家提供帮助。
void libyuvNV21ToRGBA(const unsigned char *src, unsigned char *dst, int width, int height, int mode) {
//nv21
int total = width * height;
char Y, U, V;
float R, G, B;
int index = 0;
for (int h = 0; h < height; h++) {
for (int w = 0; w < width / 2; w++) {
Y = src[h * width + w * 2];
V = src[total + (h >> 1) * width + w * 2];
U = src[total + (h >> 1) * width + w * 2 + 1];
R = Y + 1.4075 * (V - 128);
G = Y - 0.3455 * (U - 128) - 0.7169 * (V - 128);
B = Y + 1.779 * (U - 128);
if (R < 0) R = 0;
if (R > 255) R = 255;
if (G < 0) G = 0;
if (G > 255) G = 255;
if (B < 0) B = 0;
if (B > 255) B = 255;
dst[index++] = B;
dst[index++] = G;
dst[index++] = R;
dst[index++] = 255;
Y = src[h * width + w * 2 + 1];
R = Y + 1.4075 * (V - 128);
G = Y - 0.3455 * (U - 128) - 0.7169 * (V - 128);
B = Y + 1.779 * (U - 128);
if (R < 0) R = 0;
if (R > 255) R = 255;
if (G < 0) G = 0;
if (G > 255) G = 255;
if (B < 0) B = 0;
if (B > 255) B = 255;
dst[index++] = B;
dst[index++] = G;
dst[index++] = R;
dst[index++] = 255;
}
}
}