一、实验原理
研究各种图像文件格式之间的转换,主要可以从两方面入手:1.从其中一种文件格式出发,考虑图像数据在该种文件格式下的内部存储方式。如:图像数据采用的色彩空间是什么?它存储在文件数据流的哪个部分?该格式除了实际的图像数据,是否还有其它信息数据?它们又存储在哪里?2.寻找两种文件格式之间的关系,以及它们之间的转换方法。关系如文件格式之间组织结构的异同,转换方法取决于色彩空间之间的转换公式。
从上述两方面来分析比较本次实验待转换的两种文件格式——bmp、yuv。
bmp
bmp(全称Bitmap)是Windows操作系统中的标准图像文件格式。BMP文件的图像深度可选1bit、4bit、8bit、16bit及24bit。典型的BMP图像文件由四部分组成:
(1)位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
(2)位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;在转换成yuv时,bmp图像的宽、高需为4的倍数。
(3)调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
(4)位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在 24 位图中直接使用RGB,而其他的小于 24 位的使用调色板中颜色索引值。bmp的实际图像数据是以自下而上、自左向右的扫描方式存放的。
以一幅24bit的bmp(无调色板)为例,以二进制方式打开它,观察内部数据结构:
图中以不同颜色标示出了文件头和信息头部分,以及其中包含的几个重要的数据。注意计算机为小端系统,有先进后出的准则,在读取时要注意顺序。如图中图像的宽应读作(000002A8)B=680。
以下给出bmp的文件头、信息头、调色板中应包含的所有数据(已包含在windows.h库里,实际操作时要记得包含该库):
typedef struct tagBITMAPFILEHEADER {
WORD bfType; /* 说明文件的类型 */
DWORD bfSi; /* 说明文件的大小,用字节为单位 */
WORD bfReserved1; /* 保留,设置为0 */
WORD bfReserved2; /* 保留,设置为0 */
DWORD bfOffBits; /* 说明从BITMAPFILEHEADER结
构开始到实际的图像数据之间的字节偏移量 */
} BITMAPFILEHEADER; /* 文件头 */
typedef struct tagBITMAPINFOHEADER {
DWORD biSize; /* 说明结构体所需字节数 */
LONG biWidth; /* 以像素为单位说明图像的宽度 */
LONG biHeight; /*以像素为单位说明图像的高速 */
WORD biPlanes; /* 说明位面数,必须为1 */
WORD biBitCount; /*说明位数,1、2、4、8、24*/
DWORD biCompression; /* 说明图像是否压缩及
压缩类型BI_RGB,BI_RLE8,BI_RLE4,BI_BITFIELDS */
DWORD biSizeImage; /* 以字节为单位说明图像
大小 ,必须是4的整数倍*/
LONG biXPelsPerMeter; /* 目标设备的水平分
辨率,像素/米 */
LONG biYPelsPerMeter; /*目标设备的垂直分辨
率,像素/米 */
DWORD biClrUsed; /* 说明图像实际用到的颜色数,
如果为0则颜色数为2的biBitCount次方 */
DWORD biClrImportant; /*说明对图像显示有重要
影响的颜色索引的数目,如果是0,表示都重要 */
} BITMAPINFOHEADER; /* 信息头 */
typedef struct tagRGBQUAD {
BYTE rgbBlue; /*指定蓝色分量*/
BYTE rgbGreen; /*指定绿色分量*/
BYTE rgbRed; /*指定红色分量*/
BYTE rgbReserved; /*保留,指定为0*/
} RGBQUAD; /* 调色板 */