bmp图像文件

1、什么是bmp

(1)BMP图像分为两类,DDB和DIB,DDB(device-dependent   bitmap)即为设备相关位图DIB(device-independent   bitmap)即为设备无关位图

(2)DDB中不包括颜色信息,显示时是系统的调色板为基础进行各位的颜色映射的,Windows只能保证系统调色板的前20种颜色稳定不变,所以DDB只能保证正确显示色彩少于20色的位图,这便是局限性。所以现在研究的基本上都是基于DIB的图像文件。

DDB(Device-dependent bitmap)依赖于具体设备,这主要体现在以下两个方面:

  • DDB的颜色模式必需与输出设备相一致。例如,如果当前的显示设备是256色模式,那么DDB必然也是256色的,即一个像素用一个字节表示

  • 在256色以下的位图中存储的像素值是系统调色板的索引,其颜色依赖于系统调色

由于DDB高度依赖输出设备,所以DDB只能存在于内存中,它要么在视频内存中,要么在系统内存中。


(3)DIB(设备无关位图)可以在不同的机器或系统中显示位图所固有的颜色。与DDB相比而言,DIB是一种外部的位图格式,经常存储以BMP为后缀的位图文件。DIB位图还支持图像数据的压缩。BMP文件由文件头位图信息头颜色信息图像数据四部分组成。

DIB的与设备无关性主要体现在以下两个方面:
DIB的颜色模式与设备无关。例如,一个256色的DIB即可以在真彩色(24位色被称为真彩色)显示模式下使用,也可以在16色模式下使用。
256色以下(包括256色)的DIB拥有自己的颜色表,像素的颜色独立于系统调色板。
由于DIB不依赖于具体设备,因此可以用来永久性地保存图象。DIB一般是以*.BMP文件的形式保存在磁盘中的,有时也会保存在*.DIB文件中。运行在不同输出设备下的应用程序可以通过DIB来交换图象  。

2、典型的BMP图像文件由四部分组成

(1)位图头文件数据结构,它包含BMP图像文件的类型、显示内容等信息;
(2)位图信息数据结构,它包含有BMP图像的宽、高、压缩方法,以及定义颜色等信息;
(3)调色板,这个部分是可选的,有些位图需要调色板,有些位图,比如真彩色图(24位的BMP)就不需要调色板;
(4)位图数据,这部分的内容根据BMP位图使用的位数不同而不同,在24位图中直接使用RGB,而其他的小于24位的使用调色板中颜色索引值。

3、各部分数据结构

WORD为无符号16位整数,DWORD为无符号32位整数

(1)BMP文件头(14字节)

  BMP文件指定图象的高度,单位是象素头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息

  其结构定义如下:

  typedef struct tagBITMAPFILEHEADER

  {

  WORD bfType; // 位图文件的类型,必须为BM(0-1字节)

指定文件类型,必须是0x424D,即字符串“BM”,也就是说所有.bmp文件的头两个字节都是“BM”。

  DWORD bfSize; // 位图文件的大小(包括这14个字节),以字节为单位(2-5字节)

  WORD bfReserved1; // 位图文件保留字,必须为0(6-7字节)

  WORD bfReserved2; // 位图文件保留字,必须为0(8-9字节)

  DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(10-13字节)

  为从文件头到实际的位图数据的偏移字节数,即图中前三个部分的长度之和

  } BITMAPFILEHEADER;


(2)位图信息头(40字节)

  BMP位图信息头数据用于说明位图的尺寸等信息

  typedef struct tagBITMAPINFOHEADER{

  DWORD biSize; // 本结构所占用字节数(14-17字节)

指定这个结构的长度,为40

  LONG biWidth; // 位图的宽度,以像素为单位(18-21字节)

指定图象的宽度,单位是象素。

  LONG biHeight; // 位图的高度,以像素为单位(22-25字节)

指定图象的高度,单位是象素

  WORD biPlanes; // 目标设备的级别,必须为1(26-27字节)

  WORD biBitCount;// 每个像素所需的位数,必须是1(双色),(28-29字节)

指定表示颜色时要用到的位数,常用的值为1(黑白二色图), 4(16色图), 8(256), 24(真彩色图)(新的.bmp格式支持32位色

  DWORD biCompression; // 位图压缩类型必须是 0(不压缩),(30-33字节)

  // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一

  DWORD biSizeImage; // 位图的大小,以字节为单位(34-37字节)

指定实际的位图数据占用的字节数,其实也可以从以下的公式中计算出来:

biSizeImage=biWidth’ × biHeight

要注意的是:上述公式中的biWidth’必须是4的整倍数(所以不是biWidth,而是biWidth’,表示大于或等于biWidth的,最接近4的整倍数。举个例子,如果biWidth=240,则biWidth’=240;如果biWidth=241biWidth’=244)

如果biCompressionBI_RGB,则该项可能为零

  LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数(38-41字节)

指定目标设备的水平分辨率,单位是每米的象素个数

  LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数(42-45字节)

指定目标设备的垂直分辨率,单位同上

  DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数(46-49字节)

指定本图象实际用到的颜色数,如果该值为零,则用到的颜色数为2biBitCount

  DWORD biClrImportant;// 位图显示过程中重要的颜色数(50-53字节)

指定本图象中重要的颜色数,如果该值为零,则认为所有的颜色都是重要的。

  } BITMAPINFOHEADER;

(3)调色板Palette

第三部分为调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。有些位图,如真彩色图,前面已经讲过,是不需要调色板的BITMAPINFOHEADER后直接是位图数据
调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有2biBitCount个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节,其定义如下:

typedef struct tagRGBQUAD {

BYTE    rgbBlue; //该颜色的蓝色分量
BYTE    rgbGreen; //该颜色的绿色分量
BYTE    rgbRed; //该颜色的红色分量
BYTE    rgbReserved; //保留值
} RGBQUAD;

(4)实际的图象数据

对于用到调色板的位图图象数据就是该象素颜在调色板中的索引值。对于真彩色图图象数据就是实际的RGB。下面针对2色、16色、256色位图和真彩色位图分别介绍。

对于2色位图,1位就可以表示该象素的颜色(一般0表示黑,1表示白),所以一个字节可以表示8个象素

对于16色位图,4位可以表示一个象素的颜色,所以一个字节可以表示2个象素

对于256色位图,一个字节刚好可以表示1个象素

对于真彩色图,三个字节才能表示1个象素

要注意两点:

(1)    每一行的字节数必须是4的整倍数,如果不是,则需要补齐。这在前面介绍biSizeImage时已经提到了。

(2)    一般来说,.bMP文件的数据从下到上从左到右的。也就是说,从文件中最先读到的是图象最下面一行的左边第一个象素,然后是左边第二个象素……接下来是倒数第二行左边第一个象素,左边第二个象素……依次类推 ,最后得到的是最上面一行的最右一个象素。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值