```
bpp 位图的单位
16 bit per pixel
每个像素点分解为16个字节来表示
```
今天做opengl的照相机,需要将YUV40f 格式转换成RGBA 的样式。因此这里有必要好好研究下YUV420 数据的内存排列。
1. YUV简介
YUV定义:分为三个分量,“Y”表示明亮度(Luminance或Luma),也就是灰度值;而“U”和“V” 表示的则是色度(Chrominance或Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。
YUV格式:有两大类:planar和packed。
对于planar的YUV格式,先连续存储所有像素点的Y,紧接着存储所有像素点的U,随后是所有像素点的V。
对于packed的YUV格式,每个像素点的Y,U,V是连续交*存储的。
YUV存储:格式其实与其采样的方式密切相关,主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。
YUV特点:也是一种颜色编码方法,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信息一样 可以显示完整的图像,只不过是黑白的,这样的设计很好地解决了彩色电视机与黑白电视的兼容问题。并且,YUV不像RGB那样要求三个独立的视频信号同时传 输,所以用YUV方式传送占用极少的频宽。
2. 存储方式
下面我用图的形式给出常见的YUV码流的存储方式,并在存储方式后面附有取样每个像素点的YUV数据的方法,其中,Cb、Cr的含义等同于U、V。
<1>packed格式
(1) YUVY 格式 (属于YUV422)
YUYV为YUV422采样的存储格式中的一种,相邻的两个Y共用其相邻的两个Cb、Cr,分析,对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00,其他的像素点的YUV取值依次类推。
(2) UYVY 格式 (属于YUV422)
UYVY格式也是YUV422采样的存储格式中的一种,只不过与YUYV不同的是UV的排列顺序不一样而已,还原其每个像素点的YUV值的方法与上面一样。
<2>planar格式
(1) YUV422P(属于YUV422)
YUV422P 也属于YUV422的一种,它是一种Plane模式,即平面模式,并不是将YUV数据交错存储,而是先存放所有的Y分量,然后存储所有的U(Cb)分量, 最后存储所有的V(Cr)分量,如上图所示。其每一个像素点的YUV值提取方法也是遵循YUV422格式的最基本提取方法,即两个Y共用一个UV。比如, 对于像素点Y'00、Y'01 而言,其Cb、Cr的值均为 Cb00、Cr00。
(2)YV12,YU12格式(属于YUV420)
YU12和YV12属于YUV420格 式,也是一种Plane模式,将Y、U、V分量分别打包,依次存储。其每一个像素点的YUV数据提取遵循YUV420格式的提取方式,即4个Y分量共用一 组UV。注意,上图中,Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00,其他依次类推。
(3)NV12、NV21(属于YUV420)
NV12和NV21属于YUV420格式,是一种two-plane模式,即Y和UV分为两个Plane,但是UV(CbCr)为交错存储,而不是分为三个plane。其提取方式与上一种类似,即Y'00、Y'01、Y'10、Y'11共用Cr00、Cb00
从上面的知识我们知道,yuv的格式需要知道是planer 还是packet 。再知道是420 422 还444 排布。
yuv 转换RGB
我们从wiki中找到下面内容
Y′UV signals are typically created from RGB (red, green and blue) source. Weighted values of R, G, and B are summed to produce Y′, a measure of overall brightness or luminance. U and V are computed as scaled differences between Y′ and the B and R values.
yuv 是用rgb 创建出来的。 Y 与rgb有关系, 而uv 只与 BR 有关,与G无关。
在BT.601 定义下面的常量
yuv 是计算机根据rgb计算出来的。
yuv各个分量取值范围
Y=[0,1]
U= [−Umax, Umax]
V= [−Vmax, Vmax].
根据上面公式 yuv 转换RGB
整理成矩阵样式
HDTV with BT.709中规定
yuv 中的常量
其他的不变
矩阵结果是
在这里我们应该再理解一些知识。
YUV RGB 和YCbCr
我以前看资料总是把yuv和YCbCr 认为是一样的,这是没有基础的我导致的盲区。看了这篇文章 。醒悟。原来yuv 和YCbCr不是一回事情
在这里声明下
YUV - RGB Color Format Conversion
YCbCr - RGB Color Format Conversion
YPbPr - RGB Color Format Conversion
都是RGB颜色空间,只不过这些经过了一些变化而已。
YUV 用在 模拟 PAL or 模拟 NTSC视频格式,不用在数字视频格式 。
ycbcr 是用于数字视频。而SDTV bt.601
而对于RGB 对于全范围的YCbCr。 this full-range color format is used for JPEG images. 用于jpeg image full-range
而对于更高级别的HDTV -bt-709
对于YPbPr 。针对YCbCr 而言,PbPr的取值范围不同
针对HDTV
所以在ios 上我们经常看见这个宏定义
kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange = '420v', /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, video-range (luma=[16,235] chroma=[16,240]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct */
这个宏定义是规定视频输出的像素是YCbCr 格式的。取值范围是Y 是这里的luma CbCr是chroma。从上面我们知道,这个格式是数字电视格式。
kCVPixelFormatType_420YpCbCr8BiPlanarFullRange = '420f', /* Bi-Planar Component Y'CbCr 8-bit 4:2:0, full-range (luma=[0,255] chroma=[1,255]). baseAddr points to a big-endian CVPlanarPixelBufferInfo_YCbCrBiPlanar struct */
下面这个格式同理用于图片。经常用于图片
借鉴文章
wiki
yuv与rgb 转换