BMP图片的文件结构

BMP图像文件被分成4个部分:位图文件头(Bitmap File Header)、位图信息头(Bitmap Info Header)、颜色表(Color Map)和位图数据(即图像数据,Data Bits或Data Body)。

struct tagBmpFileHeader //文件头
{
	unsigned short bfType;		//标识该文件为bmp文件,判断文件是否为bmp文件,即用该值与"0x4d42"比较是否相等即可,0x4d42 = 19778
	unsigned long  bfSize;		//位图文件大小,包括这14个字节。
	unsigned short bfReserved1;	//预保留位,暂不用。
	unsigned short bfReserved2;	//预保留位,暂不用。
	unsigned long  bfOffBits;	//图像数据区的起始位置
}BmpFileHeader;//14字节:short2个,long4个

struct tagBmpInfoHeader //信息头
{
	unsigned long  biSize;	//本结构的长度,为40个字节。
	long     biWidth;	//宽度
	long     biHeight;	//高度
	unsigned short biPlanes;//目标设备的级别,必须是1。
	unsigned short biBitCount; //每个像素所占的位数(bit),其值必须为1(黑白图像)、4(16色图)、8(256色)、24(真彩色图),新的BMP格式支持32位色。
	unsigned longbiCompression;//压缩方式,有效的值为BI_RGB(未经压缩)、BI_RLE8、BI_RLE4、BI_BITFILEDS(均为Windows定义常量)。
	unsigned longbiSizeImage;  //图像区数据大小,即实际的位图数据占用的字节数
	long     biXPelsPerMeter;  //水平分辨率,像素每米
	long     biYPelsPerMeter;  //垂直分辨率,单位是像素/米
	unsigned long biClrUsed;   //位图实际用到的颜色数,如果该值为零,则用到的颜色数为2的biBitCount次幂。
	unsigned short biClrImportant;//位图显示过程,重要的颜色数;0--所有都重要
}BmpInfoHeader;//40字节

struct tagRGBPallete //调色板,实际上是一个RGBPallete结构的数组,数组的长度由biClrUsed指定
{
	unsigned char b;
	unsigned char g;
	unsigned char r;
	unsigned char alpha; //预保留位,暂不用。
}RGBPallete;

有些位图需要颜色表;有些位图(如真彩色图)则不需要颜色表,颜色表的长度由BITMAPINFOHEADER结构中biBitCount分量决定。

对于biBitCount值为1的二值图像,每像素占1bit,图像中只有两种(如黑白)颜色,颜色表也就有21=2个表项,整个颜色表的大小为2*sizeof(RGBPallete)=2*4=8个字节;

对于biBitCount值为8的灰度图像,每像素占8bit,图像中有2^8=256颜色,颜色表也就有256个表项,且每个表项的R、G、B分量相等,整个颜色表的大小为256*sizeof(RGBPallete)=256*4=1024个字节;

而对于biBitCount=24的真彩色图像,由于每像素3个字节中分别代表了R、G、B三分量的值,此时不需要颜色表,因此真彩色图的BITMAPINFOHEADER结构后面直接就是位图数据。

第4部分是位图数据,即图像数据,其紧跟在位图文件头、位图信息头和颜色表(如果有颜色表的话)之后,记录了图像的每一个像素值。对于有颜色表的位图,位图数据就是该像素颜色在调色板中的索引值;对于真彩色图,位图数据就是实际的R、G、B值(三个分量的存储顺序是B、G、R)。下面分别就2色、16色、256色和真彩色位图的位图数据进行说明:

对于2色位图,用1位就可以表示该像素的颜色,所以1个字节能存储8个像素的颜色值。

对于16色位图,用4位可以表示一个像素的颜色。所以一个字节可以存储2个像素的颜色值。

对于256色位图,1个字节刚好存储1个像素的颜色值。

对于真彩色位图,3个字节才能表示1个像素的颜色值。

需要注意两点:

第一,Windows规定一个扫描行所占的字节数必须是4的倍数,不足4的倍数则要对其进行扩充。假设图像的宽为biWidth个像素、每像素biBitCount个比特,其一个扫描行所占的真实字节数的计算公式如下:

DataSizePerLine = (biWidth * biBitCount /8+ 3) / 4*4

那么,不压缩情况下位图数据的大小(BITMAPINFOHEADER结构中的biSizeImage成员)计算如下:

biSizeImage = DataSizePerLine * biHeight

第二,一般来说,BMP文件的数据是从图像的左下角开始逐行扫描图像的,即从下到上、从左到右,将图像的像素值一一记录下来,因此图像坐标零点在图像左下角。

  • 8
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
BMP(Bitmap)是一种图像文件,其文件结构如下: 1. 文件头(14字节) ``` 偏移量 大小(字节) 说明 0 2 文件类型,BM表示Windows位图,BA表示OS/2位图 2 4 文件大小,以字节为单位 6 2 保留,必须设置为0 8 2 保留,必须设置为0 10 4 从文件头到位图数据之间的偏移量,以字节为单位 ``` 2. 位图信息头(40字节或更多) ``` 偏移量 大小(字节) 说明 14 4 位图信息头的大小,以字节为单位 18 4 位图的宽度,以像素为单位 22 4 位图的高度,以像素为单位 26 2 位图的位面数,总是为1 28 2 每个像素的位数,常见的有1、4、8、16、24和32位 30 4 压缩类型,0表示不压缩,1表示RLE8压缩,2表示RLE4压缩 34 4 位图数据的大小,以字节为单位 38 4 水平分辨率,每米像素数 42 4 垂直分辨率,每米像素数 46 4 位图使用的颜色数,如果该值为0,则颜色数为2的位数 50 4 重要颜色数,如果该值为0,则所有颜色都是重要的 54 4 调色板,如果位图的位数小于等于8,则存在调色板 ``` 3. 调色板(可选,大小为4 * 颜色数字节) ``` 偏移量 大小(字节) 说明 54 4 * 颜色数 调色板,每个颜色占4个字节,依次是蓝色分量、绿色分量、红色分量和保留值 ``` 4. 位图数据 ``` 偏移量 大小(字节) 说明 文件头中的偏移量 位图数据的大小,每个像素占据的字节数为位图信息头中的“每个像素的位数”除以8,不足4的倍数时需要进行补齐 ``` 在BMP文件中,像素数据存储的顺序为从左到右、从下到上,即先从左到右按行存储,再从下到上按列存储。这种存储方也被称为“倒立存储”。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值