最近在学习雷神的《视音频数据处理入门》, 虽然已经知道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 }
效果如下: