BMP位图扫盲

位图是Windows及其他系统上经常用到的图片类型。既然要处理位图,先得认清什么是位图。下面介绍一下位图的结构。

位图的后缀名通常为.bmp,即Bitmap的缩写。其中bit是比特位的意思,map不是地图,而是映射的意思。


位图通常由四个部分组成。如图:

1.BITMAPFILEHEADER结构的定义如下:

typedef struct tagBITMAPFILEHEADER {
  WORD  bfType;                            //指定文件类型,必须是“BM”(0x4D42)
  DWORD bfSize;                            //指定位图文件的大小,以字节表示
  WORD  bfReserved1;                       //保留字,必须为0
  WORD  bfReserved2;                       //保留字,必须为0
  DWORD bfOffBits;                         //指定从实际位图数据到文件头起始位置的偏移量,以字节表示
} BITMAPFILEHEADER, *PBITMAPFILEHEADER;



2.BITMAPINFOHEADER结构的定义如下:

typedef struct tagBITMAPINFOHEADER{
  DWORD  biSize; 		//表示本结构的大小,以字节表示
  LONG   biWidth; 		//位图的宽度,单位为像素
  LONG   biHeight; 		//位图的高度,单位为像素
  WORD   biPlanes; 		//设备上颜色平面数目,必须为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‘  x  biHeight,其中 biWidth' 是图像每行占用的字节数,

与实际宽度 biWidth 不同,biWidth' 必须是4的整数倍,即大于或等于biWidth, 最接近 4 的整倍数。如 biWidth = 401,则 biWidth' = 404。

                        如果biCompression 为 BI_RGB,则该项可能为零。

biClrUsed: 指定位图图像中实际使用的颜色数。如果为零,则图中实际使用的颜色数是 2 的 biBitCount次方。

     如黑白双色图的颜色数是黑和白两种,即 biClrUsed = 2 ^ biBitCount。

---------------------------------------------------------------------

这里还需要知道另外一种结构BITMAPINFO结构:

typedef struct tagBITMAPINFO {
  BITMAPINFOHEADER bmiHeader;         //BITMAPINFOHEADER结构
  RGBQUAD          bmiColors[n];      //调色板,其中n不确定,比如8位的位图这里的n就为256,代表颜色的数目,RGBQUAD是个像素的结构体,会在下面讲到
} BITMAPINFO, *PBITMAPINFO;
---------------------------------------------------------------------

biBitCount可取1(2色)、4(16色)、8(256色)、16(64K色,高彩色)、24(16M色,真彩色)、32(4096M色,增强型真彩色)这6种,分别对应BMP图像允许的6中颜色模式。

注意:对于 BMP文件格式,在处理单色图像和真彩色图像的时候,无论图象数据多么
庞大,都不对图象数据进行任何压缩处理,一般情况下,如果位图采用压缩格式,那么16
色图像采用RLE4压缩算法,256 色图像采用RLE8压缩算法。


3.调色板结构

有些位图需要调色板,而真彩色不需要,它们的BITMAPINFOHEADER后面直接是位图数据

typedef struct tagRGBQUAD { 
BYTE    rgbBlue; 	//蓝色分量
BYTE    rgbGreen; 	//绿色分量
BYTE    rgbRed; 	//红色分量
BYTE    rgbReserved; 	//保留值
} RGBQUAD;

4.位图数据

位图数据是一片连续的存储区域,其中保留着图像中每个像素的灰度(颜色),有的是保存的调色板索引(如2位、8位等低于24位的位图),有的直接保存的是BGR的三个分量(如24为真彩色图)。

这里需要注意的是,位图数据在文件中的每个像素是BGR的顺序存储的,而不是RGB存储的。
同时需要知道的是,位图数据的读取是从下至上,从左至右的,即最先读取最后一行的左边的第一个像素,然后再读取最后一行的左边第二个像素……


位图的结构大概就是这样。如需其他信息,请参考MSDN或者Google。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值