一、最终实现的效果
BMP图像序列(本次实验共195张BMP图片)如下:
上述BMP图片经过程序转换后,生成YUV图像如下:
上述YUV文件经过YUVPlayer播放后,效果如下:
对于不同位数的图像测试如下:
24位BMP生成的YUV:
8位BMP(因为位深是通过“画图”软件对上一幅图像的基础上直接设置的,所以会8位BMP会出现出现明显的失真。ps:“画图”保存好像无法保存成16位,我也没有装ps,请大家自行测试)
4位BMP生成的YUV:
二、BMP2YUV实现思路分析
思路方面理解起来很简单,理清BMP文件数据中的四层结构,分别是位图文件头、位图信息头、调色板、实际的位图数据。从位图信息头中提取图像宽高、实际的位图数据所在数据,然后从BMP中读取实际的位图数据,进而索引调色板数组得到每一数据的实际物理意义,即查找得到各位图数据代表了什么颜色(顺序是BGR),进而采用下列转化公式,将RGB转化为YUV。
Y=0.30R+0.59G+0.11B, U=0.493(B-Y), V=0.877(R-Y)
理解程序的关键是理清BMP文件的自包含结构,学会通过位运算提取相应数据,进行文件的读写操作。
但实际上,程序中有很多细节需要注意,本文最后会给出总结。
三、位图图像BMP介绍
位图图像(全称:bitmap), 亦称为点阵图像,区别于矢量图放大不失真的特征,位图图像是由单个像素点组成,放大后会失真。它是 Windows操作系统中的标准系统中的标准图像,是Windows环境中交换与图有关的数据的一种标准。BMP文件属于自包含文件,包含表格中四个部分。BMP 文件的图像深度可选 lbit、4bit、8bit、16bit及24bit 。
典型的BMP图像由四部分组成:
位图文件头BITMAPFILEHEADER |
位图信息头BITMAPINFOHEADER |
调色板Palette |
实际的位图数据ImageData |
ÿ