BMP位图文件数据格式

位图文件

位图文件扩展名为BMP,是英文Bitmap的简写,其特点是图像信息比较丰富,几乎不进行压缩,因此占用的磁盘空间比较大。

数据结构

典型的BMP文件由四个部分组成:

  1. 位图文件头数据结构(bitmap fileheader)
  2. 位图信息头数据结构(bitmap infoheader)
  3. 调色板(颜色信息索引表)
  4. 位图数据。

位图文件头
包括位图文件的类型,大小以及图像文件布局。BITMAP_FILEHEADER结构体的长度固定为14字节,定义如下:

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

位图信息头
包含位图关于颜色维度和色彩格式的信息,定义如下:

typedef struct tagBITMAPINFOHEADER{
	DWORD	biSize;								//本结构体占用的字节数
	LONG 	biWidth;							//位图图像的宽度,单位为像素
	LONG 	biHeight;							//位图图像的高度,单位为像素
	WORD		biPanels;						//设备上颜色平面数目,必须为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’*biHeight
    其中,biWidth‘是图像每行占用的字节数,并不是实际宽度biWidth,而是取大于等于实际宽度的最接近的4的整倍数。例如biWidth=401,则biWidth=404。(如果biCompression为BI_RGB,该项可能为0 )

  • biClrUsed:指定位图图像中实际使用的颜色数目。如果该项为0,则图像中实际使用的颜色数目是和biBitCount规定的值相同的最大数目。

调色板结构
有些位图(如索引图像)需要调色板(Palette),有些如真彩色图则不需要,他们的位图信息头后面直接跟位图数据。
调色板是一个RGBQUAD型的数组,该数组有biClrUsed个元素(若biClrUsed=0则有2的biBitCount次幂个元素)。RGBQUAD是一个用于存储RGB颜色数据的4字节结构体。

实际位图数据:
实际位图数据就是一片连续的存储区域,其中保存着图像每个像素的灰度(颜色)信息。
对于256色灰度图像,图像数据就是该像素的灰度值,1个像素用1字节来表示;
对于索引图像,图像数据是该像素颜色在调色板中的索引值;
对于真彩色图像,图像数据是实际的RGB值,1个像素要用3个字节来表示。

读取BMP文件的顺序是从下到上,从左到右,也就是从文件中最先读到的是最下一行左边第一个像素,然后依次向右读,读完最后一行后到倒数第二行左边第一个像素…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值