BMP图像格式详解

BMP位图文件格式是Windows系统交换图像数据的一种标准图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows3.0以前的BMP位图文件格式与显示设备有关,因此称其为设备相关位图(DDB)文件格式。Windows3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(DIB)格式。目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。BMP位图文件默认的扩展名为.bmp

BMP位图文件由4部分组成:位图文件头(Bitmap-file Header)、位图信息头(Bitmap-information Header)、调色板数据(Palette Data)和像素数据(Image Data)。如图所示:

位图文件头

位图信息

位图信息头

调色板数据

像素数据

 

图1.1 BMP图像文件结构

1)位图头文件

Visual C++中用BITMAPFILEHEADER 数据结构定义位图头文件,它包含文件类型、文件大小和存放位置等信息,其结构如下:

 typedef structtagBITMAPFILEHEADER

{

   WORD     bfType;   /*说明文件的类型*/

   DWORD    bfSize;  /*说明文件的大小,以字节为单位*/

   WORD     bfReserved1; /*保留,设置为0*/

   WORD     bfReserved2;/*保留,设置为0*/

   DWORD    bfOffBits; /*说明从BITMAPFILEHEADER结构开始到实际图像数据

                       阵列字节间的字节偏移量*/

}BITMAPFILEHEADER;

这个结构的长度是固定的,为14个字节,其中WORD为无符号16位二进制数,DWORD为无符号32位二进制整数。

2)位图信息头

Visual C++中用BITMAPINFOHEADER数据结构定义位图信息头,它包含位图的大小、压缩类型和颜色格式等信息,其结构如下:

typedef struct BITMAPINFOHEADER

{

     DWORD   biSize;        /*BITMAPINFOHEADER结构所需的字节数*/

     LONG     biWidth;      /*图像的宽度,以像素为单位*/

     LONG     biHeight;      /*图像的高度,以像素为单位*/

     WORD     biPlanes;      /*目标设备位平面数,其值设置为1*/

     WORD     biBitCount;    /*每像素位数,为1、4、8或24之一*/

     DWORD    biCompression; /*压缩类型,0为不压缩*/

    DWORD    biSizeImage;      /*压缩图像大小的字节数,非压缩图像为0*/

    LONG      biXPelsPerMeter;  /*水平分辨率*/

    LONG      biYPelsPerMeter;  /*垂直分辨率*/

    DWORD    biClrUsed;       /*使用的色彩数*/

    DWORD    biClrImportant;    /*重要色彩数,0表示都重要*/

}BITMAPINFOHEADER;

3)调色板

Visual C++中,调色板实际上定义为一个数组,共有biClrUsed个元素,每个元素的类型是一个RGBQUAD结构,其定义如下:

Typedef struct tagRGBQUAD

{

  BYTE  rgbBlue;      /*指定蓝色分量(值范围为0~255)*/

  BYTE  rgbGreen;     /*指定绿色分量(值范围为0~255)*/

 

  BYTE  rgbRed;       /*指定红色分量(值范围为0~255)*/

 

  BYTE  rgbReserved;    /*保留值,必须为0*/

 

}RGBQUAD;

对于24位真彩色图像,其不使用调色板,因为位图中的RGB值就代表了每个像素的颜色,因此BITMAPINFOHEADER后直接是像素数据。

4)像素数据

紧跟在调色板之后的图像数据字节阵列,用BYTE数据结构存储。图像的每一扫描行由表示图像的连续像素字节组成,每一行的字节数取决于图像的颜色数目和用像素表示的图像宽度。扫描行是由底向上存储的,这就是说,数据存放是从下到上,从左到右。从文件中最先读到的图像数据是位图最下面的最左边的第一个像素,然后是最左边的第二个像素,而最后读到的图像数据是位图最上面一行的最右边的一个像素。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值