位图文件
位图文件扩展名为BMP,是英文Bitmap的简写,其特点是图像信息比较丰富,几乎不进行压缩,因此占用的磁盘空间比较大。
数据结构
典型的BMP文件由四个部分组成:
- 位图文件头数据结构(bitmap fileheader)
- 位图信息头数据结构(bitmap infoheader)
- 调色板(颜色信息索引表)
- 位图数据。
位图文件头:
包括位图文件的类型,大小以及图像文件布局。BITMAP_FILEHEADER结构体的长度固定为14字节,定义如下:
typedef struct tagBITMAPFILEHEADER{
WORD bfType; //指定文件类型,必须是“BM”
DWORD bfSize; //指定位图文件大小(字节)
WORD bfReserved1; //保留字,必须为0
WORD bfReserved2; //保留字,必须为0
DWORD bfOffBits; //指定起始偏移量(字节),
//也就是从实际图像数据到文件头的偏移量
} BITMAPFILEHEADER, *PBITMAPFILEHEADER
位图信息头:
包含位图关于颜色维度和色彩格式的信息,定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; //本结构体占用的字节数
LONG biWidth; //位图图像的宽度,单位为像素
LONG biHeight; //位图图像的高度,单位为像素
WORD biPanels; //设备上颜色平面数目,必须为1
WORD biBitCount; //存储每个像素所使用的二进制位数
DWORD biCompression; //是否压缩存储图像数据
DWORD biSizeImage; //指定图像的大小(字节)
LONG biXPelsPerMeter; //图像的水平分辨率,单位是像素每米
LONG biYPelsPerMeter; //图像的垂直分辨率,单位是像素每米
DWORD biClrUsed; //图像实际使用了颜色索引表的多少种颜色
DWORD biClrImportant; //图像中重要的颜色数
//如果该值为0,则认为所有颜色都是重要的
} BITMAPINFOHEADER, *PBITMAPINFOHEADER
-
biBitCount: 指定存储每个像素所使用的二进制位数,可取1、4、8、16、24、32
-
biSizeImage: 指定图像的大小(字节为单位),biSizeImage=biWidth’*biHeight
其中,biWidth‘是图像每行占用的字节数,并不是实际宽度biWidth,而是取大于等于实际宽度的最接近的4的整倍数。例如biWidth=401,则biWidth=404。(如果biCompression为BI_RGB,该项可能为0 ) -
biClrUsed:指定位图图像中实际使用的颜色数目。如果该项为0,则图像中实际使用的颜色数目是和biBitCount规定的值相同的最大数目。
调色板结构:
有些位图(如索引图像)需要调色板(Palette),有些如真彩色图则不需要,他们的位图信息头后面直接跟位图数据。
调色板是一个RGBQUAD型的数组,该数组有biClrUsed个元素(若biClrUsed=0则有2的biBitCount次幂个元素)。RGBQUAD是一个用于存储RGB颜色数据的4字节结构体。
实际位图数据:
实际位图数据就是一片连续的存储区域,其中保存着图像每个像素的灰度(颜色)信息。
对于256色灰度图像,图像数据就是该像素的灰度值,1个像素用1字节来表示;
对于索引图像,图像数据是该像素颜色在调色板中的索引值;
对于真彩色图像,图像数据是实际的RGB值,1个像素要用3个字节来表示。
读取BMP文件的顺序是从下到上,从左到右,也就是从文件中最先读到的是最下一行左边第一个像素,然后依次向右读,读完最后一行后到倒数第二行左边第一个像素…