BMP(Bitmap-File)图像文件,又叫位图文件,是Windows采用的图形文件格式,在Windows环境下运行的所有图像处理软件都支持BMP图像文件格式。Windows系统内部个图像绘制操作以BMP为基础的。一个BMP文件由四个部分组成。
- l 位图文件头
- l 位图信息段
- l 调色板
- l 位图数据
一个BMP文件,可以用代码表示,如下:
typedef struct tagBITMAP_FILE { BITMAPFILEHEADER bitmapheader; BITMAPINFOHEADER bitmapinfoheader; PALETTEENTRY palette[256]; UCHAR *buffer; //UCHAR大小1字节(通BYTE) }BITMAP_FILE;
BMP文件头:BITMAPFILEHEADER
typedef struct tagBITMAPFILEHEADER{ WORD bfType; DWORD bfSize; WORD bfReserved1; WORD bfReserved2; DWORD bfOffbits; }
bfType |
说明文件的类型,该值必须是0x4D42,也就是字符‘BM’,否则表示根本不是BMP |
bfSize |
说明位图文件的大小,用字节为单位 |
bfReserved1 |
保留,必须设置为0 |
bfReserved2 |
保留,必须设置为0 |
bfOffBits |
说明从文件头开始到实际的图像数据之间的字节的偏移量。因为位图信息头和调色板的长度会根据不同情况而变化,所以需要用这个偏移值迅速的从文件中读取到为数据 |
位图信息段:BITMAPINFOHEADER
typedef struct tagBITMAPINFOHEADER { DWORD bitSize; LONG bitWidth; LONG biHeight; WORD biPlanes; WORD bitBitCount; DWORD bitCompression; DWORD bitSizeImage; LONG bitXPelsPerMeter; LONG bitYPelsPerMeter; DWORD biClrUsed; DWORD biClrImporant; }BITMAPINFOHEADER;
bitSize |
说明BITMAPINFOHEADER结构所需要的字节数 |
bitWidth |
说明像素的宽度,以像素为单位 |
biHeight |
说了像素的高度,以像素位单位。 这个值还说明该图像是倒立的图还是正向的图。 如果该值是整数,说明图像是倒向的,即:数据的第一行其实是图像的最后一行 如果该值是一个负值,则图像是正向的。 大多数的BMF文件都是倒立的,也就是说,高度值是一个正数 |
biPlanes |
表示bmp图片的平面属,显然显示器只有一个平面,所以恒为1 |
bitBitCount |
说明比特数/像素,其值为1、4、8、16、24、32 |
bitCompression |
说明图像压缩的类型,其中: BI_RGB:没有压缩 BI_RLE8:每个像素8比特的RLE压缩编码,压缩格式由2字节组成 BI_RLE4:每个像素4比特的RLE压缩编码,压缩格式由2字节组成 BI_BITFIELDS:每个像素的比特由指定的掩码决定 BI_JPEG:JPEG格式 |
bitSizeImage |
说明图像的大小,以字节为单位。当用BI_RGB格式时,可以设置为0 |
bitXPelsPerMeter |
说明水平分辨率,用像素/米表示 |
bitYPelsPerMeter |
说明垂直分辨率,用像素/米表示 |
biClrUsed |
说明位图实际使用的彩色表中的颜色索引数(0表示使用所以的调色版项) |
biClrImporant |
说明对图像显示有重要影响的颜色索引的数目,如果是0,表示很重要 |
调色板
- 对于200*200像素,颜色数为16的彩色图。每个像素用R、G、B三个分量表示,每个分量有256个级别,用8位,也就是一个字节,所有每个像素就要用到3个字节。整个图像就要用200*200*3的大小内存来存储。
如果16色图在途中最多有16种颜色。可以采用一个表,表中每一行记录一种颜色的R、G、B值。这样当我们表示一个色素的颜色时,只需要指出该颜色在第几行,即该颜色的索引值即可。比如如果表第0行表示255,0,0(红色),那么当某个色素为红色时,只需要标注0即可。
16种颜色用4bit表示,所以一个像素只需要用到半个字节。整个图像只用200*200*0.5+3*16个字节。
这张R、G、B表就是调色板,另一种叫法是颜色查找表。
typedef struct tagPALETTENTRY { BYTE peRed; BYTE peFreen; BYTE peBlue; BYTE peFlags; }PALETTEENTRY;