目前大多数图像和视频是采用每个像素8bit的方式存储,恰好是一个字节的长度。随着图像和视频向超高清方向发展,8bit已经不能满足对画质和色彩的需求。已经出现了每个像素用10bit、12bit、14bit的应用,由于它们无法用1个字节表示,如果使用2个字节又会浪费空间,所有需要将每个像素拆分表示。
一般将每像素10bit的RGB和YUV图像分别表示为PRGB10和PYUV10,每像素12bit的RGB和YUV图像分别表示为PRGB12和PYUV12,每像素10bit的RGB和YUV图像分别表示为PRGB14和PYUV14。下面分别介绍其在内存中的存储方式。
PRGB10和PYUV10
对于10bit的图像,要将连续的4个像素(按从左到右从上到下的顺序)用5个字节表示。图像的像素数需要是4的整数倍。
其在内存中的存储方式如图:
第1个像素:低8位为第1个字节,高2位在第2个字节的低2位。
第2个像素:低6位为第2个字节高6位,高4位在第3个字节的低4位。
第3个像素:低4位为第3个字节高4位,高6位在第4个字节的低6位。
第4个像素:低2位为第4个字节高2位,高8位在第5个字节。
从内存中读出像素的方式如上式所示。
PRGB12和PYUV12
对于12bit的图像,要将连续的2个像素(按从左到右从上到下的顺序)用3个字节表示。图像的像素数需要是2的整数倍。
其在内存中的存储方式如图:
第1个像素:低8位为第1个字节,高4位在第2个字节的低4位。
第2个像素:低4位为第2个字节高4位,高8位在第3个字节。
从内存中读出像素的方式如下式:
PRGB14和PYUV14
对于14bit的图像,要将连续的4个像素(按从左到右从上到下的顺序)用7个字节表示。图像的像素数需要是4的整数倍。
其在内存中的存储方式如图:
第1个像素:低8位为第1个字节,高6位在第2个字节的低6位。
第2个像素:低2位为第2个字节高2位,第3-10位在第3字节,高4位在第4个字节的低4位。
第3个像素:低4位为第4个字节高4位,第3-10位在第5字节,高2位在第6个字节的低2位。
第4个像素:低6位为第6个字节高6位,高8位在第7个字节。
从内存中读出像素的方式如下式:
以上便是10bit、12bit、14bit图像在内存中的存储格式和读取方法。
关于14bit的数据读取似乎有些问题。应该如下读取:
for (i = 0; i < width*height / 4; i++)
{
Raw_16bit_img[4 * i] = (Raw_14bit[7 * i] | ((Raw_14bit[7 * i + 1] & 0x3f) << 8));
Raw_16bit_img[4 * i + 1] = (((Raw_14bit[7 * i + 1] & 0xc0) >> 6) | ((Raw_14bit[7 * i + 2] & 0xff) << 2) | ((Raw_14bit[7 * i + 3] & 0x0f) << 10));
Raw_16bit_img[4 * i + 2] = (((Raw_14bit[7 * i + 3] & 0xf0) >> 4) | ((Raw_14bit[7 * i + 4] & 0xff) << 4) | ((Raw_14bit[7 * i + 5] & 0x03) << 12));
Raw_16bit_img[4 * i + 3] = (((Raw_14bit[7 * i + 5] & 0xfc) >> 2) | (Raw_14bit[7 * i + 6] << 6));
}
感兴趣的可以关注微信公众号Video Coding
————————————————
版权声明:本文为CSDN博主「Dillon2015」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/Dillon2015/article/details/103285757/