BMP,全称Bitmap(位图),是Windows操作系统中的标准图像文件格式,能被多种Windows程序支持。这种图像文件格式的特点是图像包含的信息比较丰富,因为它基本不进行压缩操作,但是也导致了数据量较大的缺点,其默认的文件扩展名是BMP或bmp。
BMP图像文件的结构主要由四个部分组成,位图文件头、位图信息头、调色板、DIB图像数据。下面将逐个部分进行讲述,辅以相应的C语言程序。
一、位图文件头(bitmap-file header)
位图文件头中主要包含文件类型、文件大小、存放位置等信息
typedef struct tagBMPFileHeader {
char bfty[2]; //文件类型,这里我们用"BM",即0x424D 才是Windows位图文件
int bfsize; //整个BMP文件的大小
short bfreserved1; //保留字符,必须设置为0
short bfreserved2; //保留字符,必须设置为0
int bfoffbit; //从文件起始位置到图像像素数据的字节偏移量
} BMPFileHeader;
二、位图信息头(bitmap-information header)
位图信息头主要包含位图文件的尺寸、格式等信息
typedef struct tagBMPInfoHeader {
int bisize ; //INFOHEADER结构体大小
int biwidth; //图像宽度(以像素为单位)
int biheight; //图像高度(可以为正或负,为正说明图像是倒向的即图像存储是由下到上)
short biplanes; //为目标设备说明位面数,由于图像数据平面,其值总是设为1
short bibitcount; //比特数/像素;1(2色),4(16色),8(256色)(要调色板);16,24,32(不要调色板)
int bicompression; //压缩标志(说明图像数据压缩类型):0:不压缩,1:RLE8,2:RLE4,3:,4:
int bisizeimage; //说明图像数据的大小,以字节为单位。这里使用4字节对齐的图像数据大小
int bix; //指定目标设备的水平分辨率,单位是像素/米
int biy; //指定目标设备的垂直分辨率,单位是像素/米
int biclrused; //实际使用的调色板索引数,0:使用所有的调色板索引
int biclrimportant; //重要的调色板索引数,0:所有的调色板索引都重要
} BMPInfoHeader;
关于上述bisize的说明:bisize代表的是上述tagBMPInfoHeader结构体所需要的字数。注:这个值并不一定是上述tagBMPInfoHeader结构体的尺寸,它也可能是sizeof(BITMAPV4HEADER)的值,或是sizeof(BITMAPV5HEADER)的值。这要根据该位图文件的格式版本来决定,不过,就现在的情况来看,绝大多数的BMP图像中bisize都是指上述tagBMPInfoHeader结构体大小的(可能是后两者太新的缘故)
三、彩色表(color table)
也称为调色板,使用RGB三色合成,主要控制图像颜色。
typedef struct tagRGBQUAD {
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
} RGBQUAD;
四、图像数据
像素按照每行每列的顺序来进行排列,每一行的字节数必须是4的整倍数。
上述的结构是大多数BMP的文件结构,值得注意的一点是,如果是24位的BMP图像文件,那么其中是没有彩色表这一部分的,因为24位的BMP图像每个像素采用的是3个字节表示,分别存储R、G、B三色,像素数据按照BIP的排列方式进行存储。24位与8位的BMP图像文件结构并不完全相同。
上述代码仅为BMP图像文件的结构代码,由于具体绘制代码太长,具体如何使用C语言绘制自己想要的BMP图像(例如画个滑稽脸),请参考博主上传的资源。