YUV图片的NV12格式转换为RGB/RGBA图片格式
int clamp(int value, int min, int max) {
if (value < min) {
return min;
} else if (value > max) {
return max;
} else {
return value;
}
}
//NV12转RGBA
void NV12_T_RGBA(unsigned int width, unsigned int height, unsigned char* YUV, unsigned char* rgba)
{
int frameSize = width * height;
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
// Y值
int Y = YUV[j * width + i];
// UV值
int U = YUV[frameSize + (j / 2) * width + (i & ~1)];
int V = YUV[frameSize + (j / 2) * width + (i & ~1) + 1];
// 转换
int R = clamp((int)(Y + 1.13983 * (V - 128)), 0, 255);
int G = clamp((int)(Y - 0.39465 * (U - 128) - 0.5806 * (V - 128)), 0, 255);
int B = clamp((int)(Y + 2.03211 * (U - 128)), 0, 255);
// 存储RGBA数据,将Alpha通道设置为0
rgba[(j * width + i) * 4] = R;
rgba[(j * width + i) * 4 + 1] = G;
rgba[(j * width + i) * 4 + 2] = B;
rgba[(j * width + i) * 4 + 3] = 0;
}
}
}
//NV12转RGB
void NV12_T_RGB(unsigned int width, unsigned int height, unsigned char* YUV, unsigned char* rgba)
{
int frameSize = width * height;
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
// Y值
int Y = YUV[j * width + i];
// UV值
int U = YUV[frameSize + (j / 2) * width + (i & ~1)];
int V = YUV[frameSize + (j / 2) * width + (i & ~1) + 1];
// 转换
int R = clamp((int)(Y + 1.13983 * (V - 128)), 0, 255);
int G = clamp((int)(Y - 0.39465 * (U - 128) - 0.5806 * (V - 128)), 0, 255);
int B = clamp((int)(Y + 2.03211 * (U - 128)), 0, 255);
// 存储RGBA数据,将Alpha通道设置为0
rgba[(j * width + i) * 3] = R;
rgba[(j * width + i) * 3 + 1] = G;
rgba[(j * width + i) * 3 + 2] = B;
}
}
}