网上大多数关于YUV420的资料都是关于YUV420P的,很少有YUV420SP的,因为YUV420SP的UV是交错存放的,处理起来相对麻烦点,但是YUV420SP也是一种常见格式,因此,在这里,我将关于YUV420SP格式数据的处理总结下,方便有需要的同志。
一、YUV420格式数据介绍
YUV,分为三个分量,“Y”表示明亮度,也就是灰度值;“U"和”V"表示的则是色度,作用是描述影像色彩饱和度,用于指定像素的颜色。YUV主流的采样方式有三种:YUV4:4:4,YUV4:2:2,YUV4:2:0,这里主要介绍下YUV420。
在YUV420中,一个像素点对应一个Y,一个2X2的小方块对应一个U和V。对于所有YUV420图像,它们的Y值排列是完全相同的,因为只有Y的图像就是灰度图像。YUV420又分为YUV420SP与YUV420P这两种,这两种格式的Y分布是相同的,区别在于UV:YUV420p它是先把U存放完后,再存放V,也就是说UV它们是连续的;而YUV420sp它是UV、UV这样交替存放的。(他们的内存分布图如下,左是YUV420sp,右是YUV420p)
二、从YUV内存中取数据组方法
注意YUV是每四个Y对应一个UV,并且YUV420P和YUV420SP的UV的存放格式不同,取法也不同,总的来说,YUV420P的取法简单,YUV420SP的取法相对复杂点。
1、YUV420SP
for(int j=0;j<DataHeight;j++)
{
for(int i=0;i<DataWidth;i++)
{
y=ybase[i + j * DataWidth];// 每四个y对应一个uv
u=ubase[j/2 * DataWidth+(i/2)*2];
v=ubase[j/2 * DataWidth+(i/2)*2+1]; //一定要注意是u+1
}
}
2、YUV420P
for(int j=0;j<DataHeight;j++)
{
for(int i=0;i<DataWidth;i++)
{
//yyyyyy ... uuuu ...vvv
y=ybase[i + j * DataWidth];
u=ubase[j/2 * Data