YUV422 to RGB565 Convert

来源:互联网 发布:轻轻家教 知乎 编辑:程序博客网 时间:2024/06/15 23:40

YUV是视频系统中常用的颜色空间,而显示通常是按照RGB格式进行输出显示的,要使YUV数据格式能够在显示屏上显示,需要将YUV格式转换为RGB格式,下面给出了YUV422到RGB565颜色空间转换的简单描述和程序实现。

1. 转换公式

YUV转换为RGB的公式如下:

R = Y + 1.402*(V-128);
G = Y - 0.34414*(U-128) - 0.71414*(V-128); 
B = Y + 1.772*(U-128); 

为了便于在计算机系统中进行处理,我们对公式进行一下简化:

R = Y + 1.402*(V-128) = y + v + 0.402*v = y + v + ((103 * v) >> 8);
G = Y - 0.34414*(U-128) - 0.71414*(V-128) = y - ((u * 88) >> 8) - ((v * 183) >> 8);
B = Y + 1.772*(U-128) = y + u + (u * 198) >> 8;

即:

R = y + v + ((103 * v) >> 8);
G = y - ((u * 88) >> 8) - ((v * 183) >> 8);
B = y + u + (u * 198) >> 8;


2. 程序实现

根据上面公式可以换算得到R、G、B三个分量数值,得到的数值需要经过范围转换以免越界导致色彩失真。 程序实现如下:

#define RANGE_LIMIT(x) (x > 255 ? 255 : (x < 0 ? 0 : x))void YUV422ToRGB565(const void* inbuf, void* outbuf, int width, int height){int rows, cols;int y, u, v, r, g, b;unsigned char *yuv_buf;unsigned short *rgb_buf;int y_pos,u_pos,v_pos;yuv_buf = (unsigned char *)inbuf;rgb_buf = (unsigned short *)outbuf;y_pos = 0;u_pos = 1;v_pos = 3;for (rows = 0; rows < height; rows++) {for (cols = 0; cols < width; cols++) {y = yuv_buf[y_pos];u = yuv_buf[u_pos] - 128;v = yuv_buf[v_pos] - 128;// R = Y + 1.402*(V-128)// G = Y - 0.34414*(U-128)// B = Y + 1.772*(U-128)r = RANGE_LIMIT(y + v + ((v * 103) >> 8));g = RANGE_LIMIT(y - ((u * 88) >> 8) - ((v * 183) >> 8));b = RANGE_LIMIT(y + u + ((u * 198) >> 8));*rgb_buf++ = (((r & 0xf8) << 8) | ((g & 0xfc) << 3) | ((b & 0xf8) >> 3));y_pos += 2;if (cols & 0x01) {u_pos += 4;v_pos += 4;}}}}

以上是YUV422(YUYV)转为RGB565的实现,对于其他格式的YUV格式,如YUV420, YUV422P等格式的转换,其实现都类似,主要的区别在于y, u, v分量的提取上,将程序做简单的修改就能够实现对应格式的YUV数据转换为RGB565数据格式。




原创粉丝点击