YUV420P Y分量的存储小结

最近在学习雷神的《视音频数据处理入门》, 虽然已经知道420P的YUV图片(planar格式)的存储方式为:

在像素的采样位数为8bit的情况下且宽w高h

(1).图片总字节数为w*h*3/2 Byte == w*h(Y) + w*h/4(U) + w*h/4(V)

(2).planar格式下的存储方式是YYYYYYYYYYYYYYYYUUUUVVVV

且每一个YUV分量占一个Byte, 类型为unsigned char型, 所以在内存中存储相当于一个unsigned char数组

(3).每一个Y分量的值可能不同, 因为在亮度减半的实验中要将每一个Y分量的值减半而不是统一设置为某一个值, 那么这些Y分量怎么存储的呢?

假设宽w == 4, 高h == 4, 那么有4*4 == 16个像素, 按照像素如下存储:(只谈Y分量)

start+00: Y00 Y01 Y02 Y03

start+04: Y10 Y11 Y12 Y13

start+08: Y20 Y21 Y22 Y23

start+12: Y30 Y31 Y32 Y33

那么实际内存中就是:

Y00 Y01 Y02 Y03 Y10 Y11 Y12 Y13 Y20 Y21 Y22 Y23 Y30 Y31 Y32 Y33 U U U U V V V V

更详细请见博客:

https://www.cnblogs.com/azraelly/archive/2013/01/01/2841269.html

最后自己写了一个小循环, 能够给256*256的YUV图片加小边框, 在/lianxi/lianxi_ffmpeg/chp1_RGB_YUV下的

simplest_yuv420_border.c中, 作为仿写雷神的同名函数

 46     /*add the border...*/
 47     for(i = 0; i < h; i++)
 48     {
 49         for(j = 0; j < w; j++)
 50         {
 51             if((i >= 0 && i <= (border-1)) || (i >= (h - border) && i <= (h - 1)))
 52             {
 53                 readBuff[i*w + j] = 255;
 54             }
 55             else
 56             {
 57                 if((j >= 0 && j <= (border -1)) || (j >= (w - border) && (j <= (w -1))))
 58                 {
 59                     readBuff[i*w + j] = 255;
 60                 }
 61             }
 62         }
 63     }

效果如下:

猜你喜欢

转载自blog.csdn.net/liaojunwu/article/details/81989790