在学习Metal绘制渲染的过程中,看到了颜色编码转换有关的YUV,之前知道YUV和RGB都是颜色变色编码种类,但是一直不知道具体是啥以及有啥联系。所以花了点时间翻看资料并思考理解和整理了一下知识点。
RGB和YUV
我们知道颜色都是有三原色(红、绿、蓝)组成的,也就是RGB,可以组成非常多的颜色,这些我们都知道的知识。在我们录制视频和播放视频的时候采用的一般都是RGB编码格式,在屏幕上每一个像素点都含有R分量、G分量、B分量,由这些一个个的像素上展示的颜色才构成了我们看见的图片,视频是一帧帧图片组成的。 说完了RGB,寡下YUV,YUV和RGB一样,也是每个像素都含有Y、U、V三中分量。YUV和黑白电视有关,正是因为工程师想要在黑白设备上呈现彩色而发明的编码格式😝,YUV是由Y(明亮度)、UV(色度)组成的,其实只要有Y值就能看见图片、视频,只不过是黑白的。
RGB编码格式中每个分量占一个字节,即8bit,一个像素占用24bit空间,而YUV4:4:4编码格式中也是一样的(后面会说到YUV编码格式)大小。
假如一张图片大小为1024*1024,那么他的大小为:
imageSize = 1024x1024x3x8/8/1024/1024 = 3.0MB
RGB和YUV的转换
Y = 0.299R + 0.587G + 0.114B
U = -0.14713R - 0.28886G + 0.436B
V = 0.615G - 0.51499G - 0.10001B
R = 1.0Y + 1.13983V
G = 1.0Y - 0.39465U - 0.58060V
B = 1.0Y + 2.03211U
YUV编码格式
主流采样方式三种:YUV4:4:4、YUV4:2:2、YUV4:2:0。YUV编码方式可以减少图片的大小,减少带宽和资源。
YUV 4:4:4采样
图中展示的有6个像素,每个像素有YUV分量组成。从图片我们知道YUV4:4:4采样方式每个分量都采样,所以同等宽高的图片的大小和RGB的大小是一致的。通过这个采样方式图片大小并没有减少,但是在编码转换的时候,图像从RGB转YUV,首先转成该采样方式的图像,然后再通过其他采样方式进行转换。
YUV 4:2:2采样
从这张图片我们知道该采样的特点就是UV分量分别隔一个像素进行采样,即两个像素共用一个UV分量,Y和UV分量按2:1的比例取样。采用这种编码方式,图片大小是原图大小的66.7%,这就是为啥会广泛采用YUV编码方式来进行传输,可以减少带宽、节约资源。
YUV 4:2:0采样
从上面我们知道YUV4:2:2方式图片大小就减少了1/3,但是常用的是YUV 4:2:0采样方式。
从上图可知,我们知道图片比在RGB空间的大小减少了50%,是不是很夸张!但这就是他的神奇之处。图中有两行像素,每行像素有6个像素。该采样方式的特点就是4个像素共用一套UV分量,每个像素均取Y分量,一行像素取U分量,邻行像素取V分量,并且UV分量像素取一次。例如图中的第0、1、7、8像素共用了U0和V8。正是由于该采样方式可以直接减少一半的图片大小,该方式很常用。
YUV存储格式
YUV采样存储数据有两种方式:
- planr: 平面格式,先连续存储像素点的Y分量,其次存储U分量,最后存储V分量。
- packed: 打包模式,每个像素点的Y分量、U分量、V分量连续交替存储的。
正式由于采样的方式不同和存储格式的不同所以有多种YUV格式,这些格式主要基于YUV 4:2:2采样和YUV4:2:0采样。
YUV存储格式 | 基于YUV 4:2:2采样格式 | 基于YUV 4:2:0采样格式 |
---|---|---|
planr | YUV420P、YUV420SP | |
packed | YUYV、UYVY、YUV422P(I422) |
packed方式
上表中的打包样式YUYV、UYVY都是根据每个像素均取Y分量,隔像素取U、V分量。所以他的存储排序如下:
YUYV:
Y0U0 Y1V0 Y2U2 Y3V2 Y4U4 Y5V4 Y6U6
UYVY:
U0Y0 V0Y1 U2Y2 V2Y3 U4Y4 V4Y5 U6Y6
YUV422P格式和上面差不多,都是类似的组合方式。
planr方式
基于YUV 4:2:0样式 | 格式 |
---|---|
YUV420P | YU12、YV12 |
YUV420SP | NV12、NV21 |
YU12和YV12是YUV420P类型,先存储Y分量,然后在存储UV分量,不同的是YU12是先Y再U后V,YV12是先Y再V后U存储。
Y0 Y1 Y2 Y3 Y4 ...
Uo U1 ...
V0 V1 ...
YUV420SP有NV12和NV21两种格式。与YUV 420P不同的是先存储Y分量,然后UV分量交替存储。其中NV12是iOS中有的模式,就是先存储Y分量,UV分量交替存储时先U后V;而NV21时Android Q中有的模式,就是先存储Y分量,UV分量交替存储时先V后U。
总结
通过了解YUV、RGB编码两者的关系,以及YUV编码格式带来的收益可以让我们在开发中有一定的帮助,以及YUV存储方式可以开拓一下知识点。
参考:
1.YUV-维基百科
2.YUV采样与格式