openGl es 将 YUV 数据转换为 RGB 数据接口例子
时间: 2024-03-07 09:47:16 浏览: 150
YUV 转 换成 RGB 格式 程序
以下是一个简单的将 YUV 数据转换为 RGB 数据的示例代码:
```c++
void convertYUVtoRGB(unsigned char* yuvData, unsigned char* rgbData, int width, int height) {
int frameSize = width * height;
int chromaSize = frameSize / 4;
// YUV 分量
unsigned char* Y = yuvData;
unsigned char* U = yuvData + frameSize;
unsigned char* V = yuvData + frameSize + chromaSize;
// RGB 分量
unsigned char* R = rgbData;
unsigned char* G = rgbData + frameSize;
unsigned char* B = rgbData + frameSize * 2;
int index = 0;
for (int j = 0; j < height; j++) {
for (int i = 0; i < width; i++) {
int YUVIndex = j * width + i;
int YValue = Y[YUVIndex] - 16;
int UValue = U[(j / 2) * (width / 2) + (i / 2)] - 128;
int VValue = V[(j / 2) * (width / 2) + (i / 2)] - 128;
// 转换为 RGB
int RValue = (int)(1.164f * YValue + 1.596f * VValue);
int GValue = (int)(1.164f * YValue - 0.813f * VValue - 0.391f * UValue);
int BValue = (int)(1.164f * YValue + 2.018f * UValue);
// 防止超出范围
RValue = RValue < 0 ? 0 : RValue > 255 ? 255 : RValue;
GValue = GValue < 0 ? 0 : GValue > 255 ? 255 : GValue;
BValue = BValue < 0 ? 0 : BValue > 255 ? 255 : BValue;
R[index] = (unsigned char)RValue;
G[index] = (unsigned char)GValue;
B[index] = (unsigned char)BValue;
index++;
}
}
}
```
该函数接受 YUV 数据和 RGB 数据的指针,以及图像的宽度和高度。它首先从 YUV 数据中提取 Y、U 和 V 分量,然后根据以下公式将它们转换为 RGB 分量:
```
R = 1.164 * (Y - 16) + 1.596 * (V - 128)
G = 1.164 * (Y - 16) - 0.813 * (V - 128) - 0.391 * (U - 128)
B = 1.164 * (Y - 16) + 2.018 * (U - 128)
```
请注意,此函数假定输入的 YUV 数据格式为 NV21,并且只处理一帧图像的数据。如果您的数据格式不同,请相应地修改该函数。
阅读全文