BMP图像分为两类,DDB和DIB,DDB(device-dependent bitmap)即为设备相关位图,DIB(device-independent bitmap)即为设备无关位图。
DIB(设备无关位图)
文件头+调色版(如果有的话)+数据
特征: 它自带调色版,是独立的,与设备无关
DDB中不包括颜色信息,显示时是系统的调色板为基础进行各位的颜色映射的,Windows只能保证系统调色板的前20种颜色稳定不变,所以DDB只
能保证正确显示色彩少于20色的位图,这便是局限性。
DIB(设备无关位图)可以在不同的机器或系统中显示位图所固有的颜色。
BMP(DIB)文件由文件头、位图信息头、颜色信息和图像数据四部分组成。
1. BMP文件头结构:
5个word域,内容如下:
bfType,指定文件类型,必须是0x4d42,即字符串“BM”;
fiSize,指定文件大小,包括文件头;
保留,
保留,
bfoffBits,从文件头到实际的位图数据的偏移字节数,即文件前三个部分的长度之和;
该结构长14个字节;
2 位图信息头
本结构长40个字节;
DWORD biSize,指定这个结构的长度,为40个字节;
LONG biWidth,图像宽度,像素;
LONG biHeight,图像高度,像素;
WORD biPlanes,必须为1;
WORD biBitCount,指定表示颜色用到的位数,常用值:1-黑白二色图,4-16色图,8-256色图,24-真彩色图;
DWORD biCompression,是否压缩,有效值:BI_RGB(不压缩),BI_RLE8,BI_RLE4,BI_BITFIELDS,
DWORD biSizeImage,位图数据占用的字节数,biSizeImage=biWidth * biHeight
上述公式中biWidth必须是4整数倍(大于或等于biWidth的离4最近的整数倍)。如果biCompression为BI_RGB,则该项可
能为0。
LONG biXPelsPerMeter,指定目标设备的水平分辨率;
LONG biYPelsPerMeter,指定目标设备的垂直分辨率;
DWORD biClrUsed,指定本图像实际用到的颜色数,如果该值为0,则用到的颜色数为2的biBitCount次幂;
DWORD biClrImportant,指定本图像中重要的颜色数,如果该值为0,则认为所有的颜色数都是重要的。
3 调色板(RGBQUAD)
有些位图需要调色板,而真彩色图不需要,它的BITMAPINFOHEADER后面直接是位图数据。调色板是一个数组,共有biClrUsed个元素(如果
该值为0,则有2的biBitCount次幂个元素)。每个元素是一个RGBQUAD结构。
RGBQUAD:
BYTE rgbBlue
BYTE rgbGreen
BYTE rgbRed
BYTE rgbReserved
各颜色分量和保留值。
4 图像数据
对于用到调色板的位图,图像数据就是该像素颜色在调色板中的索引值,对于真彩色图,就是实际的R、G、B值。
对于2色图,用1位就可以表示该像素的颜色,所以1个字节可以表示8个像素;
对于16色图,用4位可以表示一个像素的颜色,所以1个字节可以表示2个像素;
256色图,1个字节可以表示1个像素;
真彩色图,3个字节表示1个像素;
BMP图像数据的存储顺序是由下往上、由左向右(即图像上下颠倒存储),而图像的宽度(以字节为单位)必须是4的倍数,不到4的倍数必
须补足,并且图像的数据及其调色板数据存储格式为BGRBGR......而不是习惯的RGBRGB... 。
网上有CDIB类。