Bmp格式详解

Bmp格式详解

更新请参见博客地址http://hi.baidu.com/%C1%B5%D0%C4hjb/blog/item/e3f29bd1ee9d651ca08bb742.html

 

 

UltraEdit打开一个24bitbmp(对于一些头信息计算上需要注意的是,x86体系结构下是小端模式,即数据低位在低地址),其中的二进制数据由文件头位图信息头颜色信息(或称为色表、调色板等)图形数据四部分组成。

前三个部分后续转载文中会有详细叙述,对于图形数据,有以下几个要点需要了解:

(1)Windows规定图像文件中一个扫描行所占的字节数必须是4的倍数(即以字为单位),不足的以0填充。比如7*7像素的图像,每一行原始是7*3=21字节数据,由于非4字节对齐故会补三字节的0x00数据,使得每行为24字节数据。

(2)所有的bmp数据扫描行是上下颠倒的。也就是说一幅图片先绘制底部的像素,再绘制顶部的像素,所以这些bmp数据所表示的像素点就是从图片的左下角开始,一直表示到图片的右上角。

(3)Bmp数据的存储格式为BGR顺次存储。大家不能习惯性地认为是RGB顺次存储。

 

 

以下部分内容转载自http://apps.hi.baidu.com/share/detail/6982516

BMP文件中文称为位图文件,实际上取自Bit Map的缩写。位图分为四种:
线画稿:只有黑白两种颜色,所以像素用0,1表示。
灰度图象:在灰度图像中,像素灰度用8bit表示,像素灰度级用8bit表示,所以每个像素都是介于黑色和白色之间的256种的灰度的一种。
索引图像:在真彩色出现之前,由于技术上的原因,计算机在处理时并没有达到每像素24位的真彩色水平,为此人们创造了索引颜色。索引颜色通常也被称为映射颜色,在这种模式下,颜色都是预先定义的,并且可供选用的一组颜色也有限,索引颜色的图像最多只能显示256种颜色。一幅索引颜色图像在图像文件里定义,当打开该文件时,构成该图像具体颜色的索引值就被读入程序里,然后根据索引值找到最终的颜色。
真彩色图像:在真彩色图像中,每一个像素由红、绿和蓝三个字节组成,每个字节为8bit,表示0~255之间的不同的亮度值,这三个字节组合可以产生1670万种不同的颜色。

1.BMP文件组成
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成
2. BMP文件头
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。

其结构定义如下:

typedef struct tagBITMAPFILEHEADER
{
       WORD bfType; //
位图文件的类型,必须为BM
       DWORD bfSize; //
位图文件的大小,以字节为单位
       WORD bfReserved1; // 位图文件保留字,必须为0
       WORD bfReserved2; //
位图文件保留字,必须为0
       DWORD bfOffBits; //
位图数据的起始位置,以相对于位图
       // 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;

3.
位图信息头

BMP位图信息头数据用于说明位图的尺寸等信息。
typedef struct tagBITMAPINFOHEADER{
       DWORD biSize;    //
本结构所占用字节数
       LONG biWidth;     // 位图的宽度,以像素为单位
       LONG biHeight;    // 位图的高度,以像素为单位
       WORD biPlanes;   // 目标设备的级别,必须为1
       WORD biBitCount //
每个像素所需的位数,必须是1(双色),
                                   // 4(16
)8(256)24(真彩色)之一
       DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),
                                   // 1(BI_RLE8
压缩类型)2(BI_RLE4压缩类型)之一
       DWORD biSizeImage; // 位图的大小,以字节为单位
       LONG biXPelsPerMeter;// 位图水平分辨率,每米像素数
       LONG biYPelsPerMeter;// 位图垂直分辨率,每米像素数
       DWORD biClrUsed;      // 位图实际使用的颜色表中的颜色数
       DWORD biClrImportant;// 位图显示过程中重要的颜色数
} BITMAPINFOHEADER;

4.
颜色表
    是单色、16色、256色图像文件所特有的,相对应的调色板大小是2、16、和256,调色板以4字节为单位,每4个字节存放一个颜色值。图像的数据是指向调色板的索引。

    颜色表用于说明位图中的颜色,它有若干个表项,每一个表项是一个RGBQUAD类型的结构,定义一种颜色。RGBQUAD结构的定义如下:


typedef struct tagRGBQUAD {
       BYTE rgbBlue;      //
蓝色的亮度(值范围为0-255)
       BYTE rgbGreen;   //
绿色的亮度(值范围为0-255)
       BYTE rgbRed;      //
红色的亮度(值范围为0-255)
       BYTE rgbReserved;//
保留,必须为0
} RGBQUAD;
颜色表中RGBQUAD结构数据的个数有biBitCount来确定:
biBitCount=1,4,8时,分别有2,16,256个表项;
biBitCount=24时,没有颜色表项。
位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下:
typedef struct tagBITMAPINFO {
       BITMAPINFOHEADER bmiHeader; //
位图信息头
       RGBQUAD bmiColors[1];                 // 颜色表
} BITMAPINFO;

5.
位图数据
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:

biBitCount=1时,8个像素占1个字节;
biBitCount=4时,2个像素占1个字节;
biBitCount=8时,1个像素占1个字节;
biBitCount=24,1个像素占3个字节;
Windows
规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充,一个扫描行所占的字节数计算方法:
DataSizePerLine= (biWidth* biBitCount+31)/8;
//
一个扫描行所占的字节数
DataSizePerLine= DataSizePerLine/4*4; // 字节数必须是4的倍数
位图数据的大小(不压缩情况下):
DataSize= DataSizePerLine* biHeight;

 

 

 

 

 

 

以下转载自csdn http://blog.csdn.net/ezhong0812/article/details/6660685

PS(或画图工具)新建了10*10像素的24bmp图片,用UE打开仔细瞧瞧

-------------------------------------------------------------以下文件头

42 4D              BM一直不变

78 01 00 00    图片大小

00 00               保留为0

00 00               保留为0

36 00 00 00   偏移  非索引图是54 、索引图不固定

位图文件头共14个字节(0计数)

 

WORD bfType(01字节):

42 4d代表BM42-B,4d-M

存储顺序是424d,用双字节单位读取的时候,先读取42放在低字节,再读取4d放在高字节,程序中应该判断双字节单元中存储的是否是0x4d42

 

 if(header.bfType == 0x4d42) {}

DWORD bfSize(2345字节)

78 01 00 00    0x178(十进制376)字节,右键属性中显示的整个图片文件的大小

WORD bfReserved1(67字节)

00 00 保留字节为0

WORD bfReserved2(89字节)

00 00 保留字节为0

DWORD bfOffBits(10111213字节)

36 00 00 00   0x36(十进制54),位图数据的起始位置是第54字节

(24位图,位图文件头(BITMAPFILEHEADER14字节)和位图信息头(BITMAPINFOHEADER40字节)之后就是位图数据,没有调色板)

-----------------------------------------------------------以下信息头

 

28 00 00 00    一直不变

0A 00 00 00   

0A 00 00 00   

01 00         一直不变

18 00         多少位图

00 00 00 00    无压缩一直不变

42 01 00 00    像素数据大小

20 2E 00 00   水平分辨率

20 2E 00 00   垂直分辨率

00 00 00 00    后两个双字用在索引图

00 00 00 00

位图信息头,共40个字节

 

DWORD biSize(14151617字节)

28 00 00 00  0x28(十进制40),位图信息头占40字节

 

LONG  biWidth(18192021字节)

0a 00 00 00  0x0a(十进制10),位图的宽度是10像素

 

LONG  biHeight(22232425字节)

0a 00 00 00  0x0a(十进制10),位图的高度是10像素

 

WORD  biPlanes(2627字节)

01 00        0x01(十进制1),目标设备级别,为1

 

WORD  biBitCount(2829字节)

18 00       0x18(十进制24) 图标是24位图

 

DWORD biCompression(30313233字节)

00 00 00 00  即十进制0 ,表示图片未压缩

 

DWORD biSizeImage(34353637字节)

42 01 00 00 0x00000142(十进制322) 图片中像素数据的大小(整个图片的大小减去位图

文件头和位图信息头的大小,376-14-40=322)

 

LONG biXPelsPerMeter(38394041字节)

20 2E 00 00 0x00002E20(十进制11808) 位图水平分辨率,每米11808像素

 

LONG biYPelsPerMeter(42434445字节)

20 2E 00 00 0x00002E20(十进制11808) 位图垂直分辨率,每米11808像素

 

DWORD biClrUsed(46474849字节)

00 00 00 00 0,位图使用颜色表中的颜色数是0

DWORD biClrImportant(50515253字节)

00 00 00 00 0 位图显示过程中重要的颜色数是0

 

-----------------------------------------------------------------------------------------------------补一个1610*10bmp文件头、信息头

----------------------------------以下文件头

42 4D

00 01 00 00

00 00

00 00

36 00 00 00

位图文件头共14个字节(0计数)

 

WORD bfType(01字节):

42 4d代表BM42-B,4d-M

存储顺序是424d,存储的是低字节在前,高字节在后,所以程序中判断是否为BM需要反着写if(header.bfType == 0x4d42) {}

 

DWORD bfSize(2345字节)

00 01 00 00    0x100(十进制256)字节,右键属性中显示的整个图片文件的大小

 

WORD bfReserved1(67字节)

00 00 保留字节为0

 

WORD bfReserved2(89字节)

00 00 保留字节为0

 

DWORD bfOffBits(10111213字节)

36 00 00 00   0x36(十进制54),位图数据的起始位置是第54字节

(16位图,文件信息头(14字节)和位图信息头(40字节)之后就是位图数据,没有调色板)

-----------------------------------------------------------以下信息头

28 00 00 00

0A 00 00 00

0A 00 00 00

01 00

10 00

00 00 00 00

CA 00 00 00

20 2E 00 00

20 2E 00 00

00 00 00 00

00 00 00 00

位图信息头,共40个字节

 

 

DWORD biSize(14151617字节)

28 00 00 00  0x28(十进制40),位图信息头占40字节

 

LONG  biWidth(18192021字节)

0A 00 00 00  0x0a(十进制10),位图的宽度是10像素

 

LONG  biHeight(22232425字节)

0A 00 00 00  0x0a(十进制10),位图的高度是10像素

 

WORD  biPlanes(2627字节)

01 00        0x01(十进制1),目标设备级别,为1

 

WORD  biBitCount(2829字节)

10 00       0x0010(十进制16) 图标是16位图

 

DWORD biCompression(30313233字节)

00 00 00 00  即十进制0 ,表示图片未压缩

 

DWORD biSizeImage(34353637字节)

CA 00 00 00 0x000000CA(十进制202) 图片中像素数据的大小(整个图片的大小减去位图

 

文件头和位图信息头的大小,256-14-40=202)

 

LONG biXPelsPerMeter(38394041字节)

20 2E 00 00 0x00002E20(十进制11808) 位图水平分辨率,每米11808像素

 

LONG biYPelsPerMeter(42434445字节)

20 2E 00 00 0x00002E20(十进制11808) 位图垂直分辨率,每米11808像素

 

DWORD biClrUsed(46474849字节)

00 00 00 00 0,位图使用颜色表中的颜色数是0

DWORD biClrImportant(50515253字节)

00 00 00 00 0 位图显示过程中重要的颜色数是0

 

------------------------------------------------------------------------------------------------再补一个8位的10*10像素的bmp图文件头、信息头二进制

-------------------------------------文件头

42 4D

D8 00 00 00

00 00

00 00

5E 00 00 00

位图文件头共14个字节(0计数)

WORD bfType(01字节):

42 4d代表BM42-B,4d-M

存储顺序是424d,存储的是低字节在前,高字节在后,所以程序中判断是否为BM需要反着写if(header.bfType == 0x4d42) {}

 

DWORD bfSize(2345字节)

D8 00 00 00     0xD8(十进制216)字节,右键属性中显示的整个图片文件的大小

 

WORD bfReserved1(67字节)

00 00 保留字节为0

WORD bfReserved2(89字节)

00 00 保留字节为0

DWORD bfOffBits(10111213字节)

5E 00 00 00   0x5E(十进制94),位图数据的起始位置是第94字节

(8位图,文件信息头(14字节)和位图信息头(40字节)之后就是调色板(40字节))

(后面知道使用颜色表的颜色数是10,每个4字节,10*4=40=调色板大小)

----------------------------------------------------------- 以下信息头

28 00 00 00

0A 00 00 00

0A 00 00 00

01 00

08 00

00 00 00 00

7A 00 00 00

20 2E 00 00

20 2E 00 00

0A 00 00 00

0A 00 00 00

位图信息头,共40个字节

 

DWORD biSize(14151617字节)

28 00 00 00  0x28(十进制40),位图信息头占40字节

 

LONG  biWidth(18192021字节)

0A 00 00 00  0x0a(十进制10),位图的宽度是10像素

 

LONG  biHeight(22232425字节)

0A 00 00 00  0x0a(十进制10),位图的高度是10像素

 

WORD  biPlanes(2627字节)

01 00        0x01(十进制1),目标设备级别,为1

 

WORD  biBitCount(2829字节)

08 00       0x0008(十进制8) 图标是8位图

 

 

DWORD biCompression(30313233字节)

00 00 00 00  即十进制0 ,表示图片未压缩

 

DWORD biSizeImage(34353637字节)

7A 00 00 00 0x0000007A(十进制122) 图片中像素数据的大小(整个图片的大小减去位图

 

文件头和位图信息头和调色板(10*4)的大小,216-14-40-40=122)

 

LONG biXPelsPerMeter(38394041字节)

20 2E 00 00 0x00002E20(十进制11808) 位图水平分辨率,每米11808像素

 

LONG biYPelsPerMeter(42434445字节)

20 2E 00 00 0x00002E20(十进制11808) 位图垂直分辨率,每米11808像素

 

DWORD biClrUsed(46474849字节)

0A 00 00 00   0x0A(十进制10),位图使用颜色表中的颜色数是10

DWORD biClrImportant(50515253字节)

0A 00 00 00   0x0A(十进制10),位图显示过程中重要的颜色数是10

 

---------------------------------------之后是40字节调色板

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值