A-A+
YUV格式学习:Y转换成RGB24
除了各种YUV格式转换成RGB外,还有一种是只转Y到RGB,如果YUV只有Y分量,也就就是YUV400这个格式了。如果成RGB后,显示出来的图像就是灰度图(因为Y是亮度),也可以理解为黑白图吧。下面给出转换函数:
/** 只支持平面、半平面的格式 交织的不支持,因为不知道如何获取Y */ void y_to_rgb24(unsigned char *yuv, unsigned char *rgb, int width, int height) { int y, cb, cr; int r, g, b; int i = 0; unsigned char* p_y; unsigned char* p_rgb; p_y = yuv; p_rgb = rgb; // 只转换Y的,U、V也需要,其值固定为128 cb = 128; cr = 128; init_yuv422p_table(); for (i = 0; i < width * height; i++) { y = p_y[0]; r = MAX (0, MIN (255, (V[cr] + Y1[y])/10000)); //R value b = MAX (0, MIN (255, (U[cb] + Y1[y])/10000)); //B value g = MAX (0, MIN (255, (Y2[y] - 5094*(r) - 1942*(b))/10000)); //G value p_rgb[0] = r; p_rgb[1] = g; p_rgb[2] = b; p_rgb += 3; p_y++; } }
注意,这个函数只支持平面的格式,因为平面格式的Y是在最前面的,并占用width*height大小。如果是YUYV这类的打包格式,图像显示是错乱的。
PS:至此,除了YUV411这个很少用的格式,其它我所接触的格式转换就完成了。可以为我准备写的播放器做下强有力的技术支撑。
李迟 2015.8.7 中午