YUV422 to RGB565 Convert

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数据格式。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值