BMP图像结构及绘制

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图像(例如画个滑稽脸),请参考博主上传的资源。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值