BMP文件格式

1. 简单介绍BMP(Bitmap)位图
|前  设备相关位图DDB(device-dependent bitmap)
windows 3.0
|后 设备无关位图DIB(device-independent bitmap)

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

3. 位图文件头(bitmap-file header)
typedef struct tagBITMAPFILEHEADER_t {
    unsigned short    bfType;            //文件标识 2字节 必须为BM
    unsigned long      bfSize;                //文件大小 4字节
    unsigned short    bfReserved1;        //保留,每字节以"00"填写 2字节
    unsigned short    bfReserved2;        //同上 2字节
    unsigned long   bfOffBits;            //记录图像数据区的起始位置(图象数据相对于文件头字节的偏移量)。 4字节
} BITMAPFILEHEADER_t, *PBITMAPFILEHEADER_t;//14

这个没有什么可讲的,一看就明白。

4.  图像描述信息块
typedef struct tagBITMAPINFOHEADER_t{
    unsigned long  biSize;                //表示本结构的大小 4字节
    long   biWidth;                //位图的宽度  4字节
    long   biHeight;            //位图的高度  4字节
    unsigned short   biPlanes;            //永远为1 ,   2字节
    unsigned short   biBitCount;        //位图的位数  分为1 4 8 16 24 32   2字节
    unsigned long  biCompression;       //压缩说明   4字节
    unsigned long  biSizeImage;            //表示位图数据区域的大小以字节为单位  4字节
    long   biXPelsPerMeter;                //用象素/米表示的水平分辨率   4字节
    long   biYPelsPerMeter;                //用象素/米表示的垂直分辨率   4字节
    unsigned long  biClrUsed;            //位图使用的颜色索引数   4字节
    unsigned long  biClrImportant;        //对图象显示有重要影响的颜色索引的数目  4字节 
} BITMAPINFOHEADER_t, *PBITMAPINFOHEADER_t; //40

biPlanes为位图为的面数,始终为1(位图就一面)

biBitCount为位图的位数

   当位图位数为1位时叫做双色(2的一次方),即可以表示两种颜色……调色板有2个表项

   当位图位数为4使叫做16色(2的4次方),即可以表示16种颜色……调色板有16个表项

   当位图位数为8时叫做256色(2的8次方),即可以表示256种颜色……调色板有256个表项

   ----------------------------------------------------------------------------------------------------------以上调色板有表项  

   当位图位数为16时叫做高彩色,可以表示216种颜色 

   当位图位数为32时叫做4G色又叫做增强型真彩色(2的32次方),即可以表示4G种颜色

   ----------------------------------------------------------------------------------------------------------以下调色板没有表项

   当位图位数为24时叫做真彩色,可以表示224种颜色

biCompression
    BI_RGB:没有压缩; 
    BI_RLE8:每个象素8比特的RLE压缩编码,压缩格式由2字节组成(重复象素计数和颜色索引); 
    BI_RLE4:每个象素4比特的RLE压缩编码,压缩格式由2字节组成 
    BI_BITFIELDS:每个象素的比特由指定的掩码决定。

biSizeImage

    表示位图的大小,以字节单位。在windows下位图的每一行必须是4的倍数,当用BI_RGB格式时,可以设置为0.

biClrUsed
     说明位图实际使用的彩色表中的颜色索引数(设为0的话,则说明使用所有调色板项)

biClrImportant
     说明对图象显示有重要影响的颜色索引的数目,如果是0,表示都重要。

 最后对biBitCount的位数做一下说明

biBitCount=1

     表示位图最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这两种颜色。图像信息头装调色板中将有两个调色板项,称为索引0和索引1。图象数据阵列中的每一位表示一个象素。如果一个位是0,显示时就使用索引0的RGB值,如果位是1,则使用索引1的RGB值。 
biBitCount=4

     表示位图最多有16种颜色。每个象素用4位表示,并用这4位作为彩色表的表项来查找该象素的颜色。例如,如果位图中的第一个字节为0x1F,它表示有两个象素,第一象素的颜色就在彩色表的第2表项中查找,而第二个象素的颜色就在彩色表的第16表项中查找。此时,调色板中缺省情况下会有16个RGB项。对应于索引0到索引15。 
biBitCount=8

     表示位图最多有256种颜色。每个象素用8位表示,并用这8位作为彩色表的表项来查找该象素的颜色。例如,如果位图中的第一个字节为0x1F,这个象素的颜色就在彩色表的第32表项中查找。此时,缺省情况下,调色板中会有256个RGB项,对应于索引0到索引255。 
biBitCount=16

      表示位图最多有216种颜色。每个色素用16位(2个字节)表示。这种格式叫作高彩色,或叫增强型16位色,或64K色。它的情况比较复杂,当biCompression成员的值是BI_RGB时,它没有调色板。16位中,最低的5位表示蓝色分量,中间的5位表示绿色分量,高的5位表示红色分量,一共占用了15位,最高的一位保留,设为0。这种格式也被称作555 16位位图。如果biCompression成员的值是BI_BITFIELDS,那么情况就复杂了,首先是原来调色板的位置被三个DWORD变量占据,称为红、绿、蓝掩码。分别用于描述红、绿、蓝分量在16位中所占的位置。在Windows 95(或98)中,系统可接受两种格式的位域:555和565,在555格式下,红、绿、蓝的掩码分别是:0x7C00、0x03E0、0x001F,而在565格式下,它们则分别为:0xF800、0x07E0、0x001F。你在读取一个像素之后,可以分别用掩码“与”上像素值,从而提取出想要的颜色分量(当然还要再经过适当的左右移操作)。在NT系统中,则没有格式限制,只不过要求掩码之间不能有重叠。(注:这种格式的图像使用起来是比较麻烦的,不过因为它的显示效果接近于真彩,而图像数据又比真彩图像小的多,所以,它更多的被用于游戏软件)。 
biBitCount=24

      表示位图最多有224种颜色。这种位图没有调色板(bmiColors成员尺寸为0),在位数组中,每3个字节代表一个象素,分别对应于颜色R、G、B。 
biBitCount=32

      表示位图最多有232种颜色。这种位图的结构与16位位图结构非常类似,当biCompression成员的值是BI_RGB时,它也没有调色板,32位中有24位用于存放RGB值,顺序是:最高位—保留,红8位、绿8位、蓝8位。这种格式也被成为888 32位图。如果 biCompression成员的值是BI_BITFIELDS时,原来调色板的位置将被三个DWORD变量占据,成为红、绿、蓝掩码,分别用于描述红、绿、蓝分量在32位中所占的位置。在Windows 95(or 98)中,系统只接受888格式,也就是说三个掩码的值将只能是:0xFF0000、0xFF00、0xFF。而在NT系统中,你只要注意使掩码之间不产生重叠就行。(注:这种图像格式比较规整,因为它是DWORD对齐的,所以在内存中进行图像处理时可进行汇编级的代码优化(简单))。

5.  调色板
typedef struct tagRGBQUAD_t {
    unsigned char    rgbBlue;
    unsigned char    rgbGreen;
    unsigned char    rgbRed;
    unsigned char    rgbReserved;
} RGBQUAD_t, *PRGBQUAD_t;

颜色表中RGBQUAD_t结构数据的个数有biBitCount来确定:
当biBitCount=1,4,8时,分别有2,16,256个表项;
当biBitCount=24时,没有颜色表项。

当biBitCount=16,32时,根据biCompression的值来确定颜色表项的内容。

6.  最后就是真正的位图数据了

写在最后:其实我们平时用的最多的就是24位的位图了,所以我写了一个例子给大家参考,源代码呦。在VS 2008编译通过,标准C语言的

稍作调整在别的编译器上编译也问题不大要用的话联系我MSN:zhangzhao130181@sina.com

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值