YUV422格式的数据转换成RGB24

     作相机类程序是常常遇到YUV格式转RGB格式的操做,如下是一个简略有效的算法算法

typedef unsigned char uint8_t;
void yuv422_to_rgb24(unsigned char *yuv422,unsigned char *rgb24, int width, int height)
{
int x,y;
uint8_t *yuv444;
yuv444 = (uint8_t *) malloc(sizeof(uint8_t) * width * height * 3);
for(x = 0,y = 0;x < width*height*2,y < width*height*3;x+=4,y+=6)
{
yuv444[y] = yuv422[x];
yuv444[y+1] = yuv422[x+1];
yuv444[y+2] = yuv422[x+3];
yuv444[y+3] = yuv422[x+2];
yuv444[y+4] = yuv422[x+1];
yuv444[y+5] = yuv422[x+3];
}
for(x = 0;x < width*height*3;x+=3)
{
rgb24[x+2] = yuv444[x] + 1402*(yuv444[x+2] - 128)/1000;
rgb24[x+1] = yuv444[x]-34414*(yuv444[x+1]-128)/100000 - 71414*(yuv444[x+2]-128)/100000;
rgb24[x] = yuv444[x] + 1772*(yuv444[x+1] - 128)/1000;
if (rgb24[x]>255)rgb24[x]=255;
if (rgb24[x]<0)rgb24[x]=0;
if (rgb24[x+1]>255)rgb24[x+1]=255;
if (rgb24[x+1]<0)rgb24[x+1]=0;
if (rgb24[x+2]>255)rgb24[x+2]=255;
if (rgb24[x+2]<0)rgb24[x+2]=0;
}
free(yuv444);
}
post


还有很重要的一点就是转换后的数据若是直接显示好像是会图片左右倒置的,在此也给出了解决方案ui

  

正常显示图像,实现代码为: ::StretchDIBits(hdc,0,0,m_nWidth,m_nHeight,0,0,m_nWidth,m_nHeight,m_pBits,m_pBMI,DIB_RGB_COLORS,SRCCOPY); 水平翻转显示图像,实现代码为: ::StretchDIBits(hdc,0,0,m_nWidth,m_nHeight,m_nWidth,0,-m_nWidth,m_nHeight,m_pBits,m_pBMI,DIB_RGB_COLORS,SRCCOPY); 垂直翻转显示图像,实现代码为: ::StretchDIBits(hdc,0,0,m_nWidth,m_nHeight,0,m_nHeight,m_nWidth,-m_nHeight,m_pBits,m_pBMI,DIB_RGB_COLORS,SRCCOPY); 水平与垂直翻转显示图像,实现代码为: ::StretchDIBits(hdc,0,0,m_nWidth,m_nHeight,m_nWidth,m_nHeight,-m_nWidth,-m_nHeight,m_pBits,m_pBMI,DIB_RGB_COLORS,SRCCOPY);