YUV422格式的数据转换成RGB24
2013-07-01 13:58
204 查看
做相机类程序是经常遇到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);
}
还有很重要的一点就是转换后的数据如果直接显示好像是会图片左右倒置的,在此也给出了解决方案
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);
}
还有很重要的一点就是转换后的数据如果直接显示好像是会图片左右倒置的,在此也给出了解决方案
正常显示图像,实现代码为: ::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); |
相关文章推荐
- YUV422P、YV16、NV16、NV61格式转换成RGB24
- YUV格式学习:YUV422P、YV16、NV16、NV61格式转换成RGB24
- AnyChat视频回调RGB24 byte[]数据转换成Bitmap图像
- YV12 格式的图片转换为 RGB24 格式
- YUV格式学习:Y转换成RGB24
- yuv数据格式介绍与rgb的转换,图像文件的封装
- YUV格式学习:YUV420P、YV12、NV12、NV21格式转换成RGB24
- YUV格式学习:YUV444转换RGB24
- YUV格式学习:YUYV、YVYU、UYVY、VYUY格式转换成RGB24
- YUV格式学习:YUV420P、YV12、NV12、NV21格式转换成RGB24(转载)
- YUV格式学习:YUV420P、YV12、NV12、NV21格式转换成RGB24
- YUV420转换成RGB24
- json数据格式和object对象之间相互转换
- SegY 数据格式的转换小结
- Json是什么?Json的数据格式如何转换
- 使用Javascript/jQuery将javascript对象转换为json格式数据 - 海涛的CSDN博客 - 博客频道 - CSDN.NET
- json list map 对象 转换成tostring Json的数据格式
- 使用Javascript/jQuery将javascript对象转换为json格式数据
- C# 的数据类型转换 c#字符串转换格式 c#日期数字字符串整形格式转换
- spring MVC 返回数据自动转换为json格式