像素数据YUV简介与数据存储格式介绍
前言
照例是先废话几句,下面的内容都是在学习时从网上找来的,并非我原创,我之所以要写这篇笔记是因为网的内容都很分散,找的时候要从各个地方看,很不方便,所以就自己总结了一篇,同样的,如果你搜到了这篇文章且有地方没看懂,请评论让我知道,谢谢!如果看懂了且对你有帮助可以点个赞:)
认识YUV
以下我的理解,因为学习时间不久,可能不一定准确:
YUV与RGB一样,都是像素数据的编码格式,一组YUV渲染屏幕上的一个像素,控制屏幕用色彩的形式将事物表现出来,其中Y表示像素中的亮度,英文是Luminance,U表示色度,英文是Chrominance,V表示浓度或饱和度,英文是Chroma。这是一种压缩后的颜色表示方法,占用更少的物理空间,且对颜色的表现失真不明显,所以现在非常常用,我见过的很多视频在播放时都是使用这种形式展现的。
YUV的宏观存储方式
在宏观上,YUV有两种存储方式:planar、packed。
planar:从字面意思上来看,planar是平面的意思,平面比较平整,对应到存储方式上就是把YUV三种分量分别存储,以I420为例,存储方式为:YYYYYYYYUUVV,简单明了,先把Y存完,再存U,再存V,这种在解析时很方便
packed:从字面意思来看,packed是打包的意思,打包就不一定是平整的了,对应到存储方式上就是把YUV三种分量交叉存储,以YUY2为例,存储方式为:Y0U0Y1V0 Y2U1Y3V1,这种方式在解析时就会比较麻烦
上面只是举了两个觉的例子,事实上还有很多其它的格式,后面一一细讲。
采样方式
采样方式即如何表现一个像素,现在主流的有三种采样方式,4:4:4、4:2:2、4:2:0,这三种比例是YUV三种分量的比例,咱们前面说过像素是用YUV三个分量控制显示的,所以一个像素应该包含一个Y,一个U,一个V,如果要完全存储,那一个一个像素点就要存储YUV三个分量,这种形式就是4:4:4了。但是因为人的眼睛对色度和饱和度不是特别敏感,所以一定程度上丢失一部分UV并不影响我们分辨颜色,所以聪明的先驱们为了节省存储空间,在存储时就故意丢掉部分UV分量,用两个Y分量共用一组UV分量,这种形式就是4:2:2,或用四个Y分量共用一组UV,这种形式就是4:2:0了。用网上找的图表示比较形象。
下图中以黑点表示采样该像素点的Y分量,以空心圆圈表示采用该像素点的UV分量
在存储时YUV各占一个字节Byte,如果4:4:4方式,那一个256X256分辨率的图片要占用256×256×3=196608Byte,4:2:2方式要占用256×256×2=131072Byte,4:2:0方式要占用256×256×2/3=43690.7Byte,可以看到采用4:2:0方式存储空间整整减少了一半。
常见存储格式
YU12/I420
该格式属于4:2:0类型,存储方式上面已经说过,就是先存储把全部的Y分量存完,再存U分量,最后存V分量,从网上找了一张很形象的图:
可以看到,第一行的Y1Y2和第二行的Y7Y8共同使用一组UV分量U1V1。
YV12
该格式与YU12基本一样,唯一的区别是先存储V分量再存储U分量,对应到上图把第五行和第六行位置互换一下就是了。
以上两种格式我们可以看到都是4:2:0的,因为都是planar方式存储,简称420p。
除了上面两种,还有两种4:2:0,NV12和NV21,这两种是比较特殊的存储格式,是planar和packed混合存储的,分别看下
NV12
该格式是先存储全部的Y分量,然后UV分量交叉存储,用图像表示下:
很直观,不多说了。
NV21
该格式与NV21的区别和上面YU12/YV12一样,唯一的区别只是UV分量交叉的顺序不同,NV12是U排前面,NV21是V排前面,用图像表示如下:
上面两种虽然也是4:2:0类型,但是并不是完全的planar格式,所以又称为420sp,与420p进行区分。
上面说的都是4:2:0类型的,下面说几个4:2:2类型较常见的
YUV422P
名字中带P表示是planar格式存储,该格式存储方式与I420是一样的,唯一的区别是UV分量的数量不同,I420中四个Y共用一组UV,而该格式中两个Y共用一组UV,也就是说UV分量相对于I420在数量上多了一倍,从网上找了一张图,如下:
如上图,在渲染时Y00与Y01会共用U00和V00.
YUYV/YUY2
该格式属于4:2:2类型,且是用packed形式存储的,上面也简单的说过,存储方式如下图:
可以看到,每两个Y分量共用一组UV分量,存储顺序是YUYV。
YVYU
该格式与YUYV相似,只是存储时UV分量顺序不同而已,为YVYU。
UYVY
该格式也是4:2:2类型,与上面两种方式并无大的不同,从网上找了一张图如下:
可以看到存储时YUV分量的顺序如名字所示:UYVY。
结语
上面是比较常见的存储格式,除了这些还有其它的,但是我个人查找资料看来,用的并不多,所以就没记录。