YUV格式有很多种,按其采样方式,有444、422、420,还有411(但不常见)。针对数据的排序,又有平面格式和打包格式,还有“踢啊”特有的半平面格式——这些排列组合,就显得YUV格式多种多样,初看起来杂乱无章,但只要用心,就能理出头绪。像我,也是花了很多时间去慢慢搜索才真正理解。有时间会系统整理几篇文章出来,也会实践一下。
YUV444格式没有进行压缩,占用空间为with*height*3
,与RGB占用空间相同。因此在转换上也很方便,但很多编码器似乎不太支持该格式。或许和其占用空间有莫大的关联吧。
首先给出生成查询表格的函数,代码是在网上找来的,如下:
1 | #ifndef MAX |
在转换成RGB之前,要调用上述函数。下面是YUV444转换成RGB24的函数实现:
1 | void yuv4444_to_rgb24(unsigned char *yuv, unsigned char *rgb, int width, int height) |
从代码看到,实际上就是扫描YUV444的内存,得到Y、U、V的分量,然后查表得到对应用R、G、B值,再赋值给RGB内存指针。如前所述,YUV444与RGB占用空间相同,故在代码并无太多的技巧。
李迟 2015.8.5 晚上