`
luliangok
  • 浏览: 781302 次
文章分类
社区版块
存档分类
最新评论

BMP图像格式解析(转)

 
阅读更多
BMP图像格式解析
一,文件格式定义:
BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。Windows 3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB(device-dependent bitmap)文件格式。Windows 3.0以后的BMP图象文件与显示设备无关,因此把这种BMP图象文件格式称为设备无关位图DIB(device-independent bitmap)格式(注:Windows 3.0以后,在系统中仍然存在DDB位图,象BitBlt()这种函数就是基于DDB位图的,只不过如果你想将图像以BMP格式保存到磁盘文件中时,微软极力推荐你以DIB格式保存),目的是为了让Windows能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.RLE作扩展名)。
文件
文件可看成由4个部分成:位文件(bitmap-file header)、位信息(bitmap-information header)、彩色表(color table)和定的字节阵列,它具有如下所示的形式。
文件的
构名称
符号
文件(bitmap-file header)
BITMAPFILEHEADER
bmfh
信息(bitmap-information header)
BITMAPINFOHEADER
bmih
彩色表(color table)
RGBQUAD
aColors[]
象数据列字
BYTE
aBitmapBits[]
文件构可合在表6-01中。
01 文件构内容摘要
 
偏移量
域的名称
大小
内容
 
 
 
象文件
0000h
文件标识
2 bytes
两字的内容用来识别型:
‘BM’ : Windows 3.1x, 95, NT, …
‘BA’ :OS/2 Bitmap Array
‘CI’ :OS/2 Color Icon
‘CP’ :OS/2 Color Pointer
‘IC’ : OS/2 Icon
‘PT’ :OS/2 Pointer
注:因OS/2并没有被普及,所以在,你只需判断第一个标识“BM”就行。
 
0002h
File Size
1 dword
用字表示的整个文件的大小
 
0006h
Reserved
1 dword
保留,必须设0
 
000Ah
Bitmap Data Offset
1 dword
从文件始到位数据始之的数据(bitmap data)的偏移量
 
000Eh
Bitmap Header Size
1 dword
信息(Bitmap Info Header)的度,用来描述位色、压缩方法等。下面的度表示:
28h - Windows 3.1x, 95, NT, …
0Ch - OS/2 1.x
F0h - OS/2 2.x
注:在Windows95982000等操作系中,位信息度并不一定是28h,因制定出了新的BMP文件格式,其中的信息头结化比大,度加。所以最好不要直接使用常数28h,而是应该从具体的文件中这样才能确保程序的兼容性。
 
0012h
Width
1 dword
度,以象素为单
 
0016h
Height
1 dword
的高度,以象素为单
 
001Ah
Planes
1 word
的位面数(注:该值1
信息
 
 
001Ch
Bits Per Pixel
1 word
个象素的位数
1 - 色位实际上可有两种颜色,缺省情况下是黑色和白色。你可以自己定义这种颜色)
4 - 16 色位
8 - 256 色位
16 - 16bit 高彩色位
24 - 24bit 真彩色位
32 - 32bit 增型真彩色位
 
001Eh
Compression
1 dword
压缩说明:
0 - 压缩 (使用BI_RGB表示)
1 - RLE 8-使用8位RLE压缩方式(用BI_RLE8表示)
2 - RLE 4-使用4位RLE压缩方式(用BI_RLE4表示)
3 - Bitfields-位域存放方式(用BI_BITFIELDS表示)
 
0022h
Bitmap Data Size
1 dword
用字数表示的位数据的大小。数必是4的倍数
 
0026h
HResolution
1 dword
用象素/米表示的水平分辨率
 
002Ah
VResolution
1 dword
用象素/米表示的垂直分辨率
 
002Eh
Colors
1 dword
使用的色数。如8-比特/象素表示100h或者 256.
 
0032h
Important Colors
1 dword
指定重要的色数。当域的等于色数(或者等于0),表示所有色都一重要
色板数据
根据BMP版本的不同而不同
Palette
N * 4 byte
色板范。色板中的个表4个字用下述方法来描述RGB
  • 1字用于色分量
  • 1字用于绿色分量
  • 1字用于色分量
  • 1用于填充符(0)
象数据
根据BMP版本及色板尺寸的不同而不同
Bitmap Data
xxx bytes
域的大小取决于压缩方法及像的尺寸和像的位深度,它包含所有的位数据字些数据可能是彩色色板的索引号,也可能是实际RGB将根据像信息中的位深度来决定。
构件
1. 文件
文件包含有于文件型、文件大小、存放位置等信息,在Windows 3.0以上版本的位文件中用BITMAPFILEHEADER构来定
typedef struct tagBITMAPFILEHEADER { /* bmfh */
UINT bfType;
DWORD bfSize;
UINT bfReserved1;
UINT bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
其中:
bfType
明文件的.该值必需是0x4D42,也就是字符'BM'。我不需要判断OS/2的位图标识这么在来看似乎已没有什了,而且如果要支持OS/2的位,程序将得很繁所以,在此只建察'BM'标识
bfSize
明文件的大小,用字节为单
bfReserved1
保留,必须设0
bfReserved2
保留,必须设0
bfOffBits
明从文件头开始到实际象数据之的字的偏移量。个参数是非常有用的,因信息色板的度会根据不同情况而化,所以你可以用个偏移迅速的从文件中取到位数据。
2. 位信息
信息用BITMAPINFO构来定,它由位信息(bitmap-information header)和彩色表(color table)成,前者用BITMAPINFOHEADER构定,后者用RGBQUAD构定。BITMAPINFO构具有如下形式:
typedef struct tagBITMAPINFO { /* bmi */
BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[1];
} BITMAPINFO;
 
其中:
bmiHeader
明BITMAPINFOHEADER构,其中包含了有的尺寸及位格式等信息
bmiColors
明彩色表RGBQUAD构的列,其中包含索引像的真RGB
BITMAPINFOHEADER构包含有位文件的大小、压缩类型和色格式,其构定义为
typedef struct tagBITMAPINFOHEADER { /* bmih */
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
 
其中:
biSize
明BITMAPINFOHEADER构所需要的字数。注:并不一定是BITMAPINFOHEADER构的尺寸,它也可能是sizeof(BITMAPV4HEADER)的,或是sizeof(BITMAPV5HEADER)的要根据文件的格式版本来决定,不,就在的情况来看,大多数的BMP像都是BITMAPINFOHEADER构的(可能是后两者太新的故吧:-)。
biWidth
象的度,以象素为单
biHeight
象的高度,以象素为单位。注:除了用于描述像的高度之外,它有另一个用,就是指明该图像是倒向的位是正向的位。如果该值是一个正数,像是倒向的,如果该值是一个数,则说像是正向的。大多数的BMP文件都是倒向的位,也就是,高度是一个正数。(注:当高度是一个(正向像),像将不能被压缩(也就是biCompression将不能是BI_RLE8BI_RLE4)。
biPlanes
标设备说明位面数,其是被设为1
biBitCount
明比特数/象素,其值为1481624、或32
biCompression
象数据压缩型。可以是下述之一:
  • BI_RGB:没有压缩
  • BI_RLE8个象素8比特的RLE压缩编码压缩格式由2节组(象素数和色索引)
  • BI_RLE4个象素4比特的RLE压缩编码压缩格式由2节组
  • BI_BITFIELDS:个象素的比特由指定的掩决定。
biSizeImage
象的大小,以字节为单位。当用BI_RGB格式,可0
biXPelsPerMeter
明水平分辨率,用象素/米表示
biYPelsPerMeter
明垂直分辨率,用象素/米表示
biClrUsed
明位图实际使用的彩色表中的色索引数(设为0则说明使用所有色板
biClrImportant
对图示有重要影响的色索引的数目,如果是0,表示都重要。
就BITMAPINFOHEADER构作如下明:
(1) 彩色表的定位
用程序可使用存在biSize成中的信息来找在BITMAPINFO构中的彩色表,如下所示:
pColor = ((LPSTR) pBitmapInfo + (WORD) (pBitmapInfo->bmiHeader.biSize))
(2) biBitCount
biBitCount=1 表示位最多有两种颜色,缺省情况下是黑色和白色,你也可以自己定义这种颜色。像信息色板中将有两个色板,称索引0和索引1象数据列中的一位表示一个象素。如果一个位是0就使用索引0RGB,如果位是1使用索引1RGB
biBitCount=4 表示位最多有16种颜色。个象素用4位表示,并用4位作彩色表的表象素的色。例如,如果位中的第一个字节为0x1F,它表示有两个象素,第一象素的色就在彩色表的第2找,而第二个象素的色就在彩色表的第16找。此色板中缺省情况下会有16RGB对应于索引0到索引15
biBitCount=8 表示位最多有256种颜色。个象素用8位表示,并用8位作彩色表的表象素的色。例如,如果位中的第一个字节为0x1F个象素的色就在彩色表的第32找。此,缺省情况下,色板中会有256RGB对应于索引0到索引255
biBitCount=16 表示位最多有216种颜色。个色素用16位(2个字)表示。这种格式叫作高彩色,或叫增16位色,或64K色。它的情况比较复杂,当biCompressionBI_RGB,它没有色板。16位中,最低的5位表示色分量,中5位表示绿色分量,高的5位表示色分量,一共占用了15位,最高的一位保留,设为0这种格式也被称作555 16位位。如果biCompressionBI_BITFIELDS,那情况就复杂了,首先是原来色板的位置被三个DWORD量占据,称为红绿。分用于描述绿分量在16位中所占的位置。在Windows 95(或98)中,系可接受两格式的位域:555565,在555格式下,绿的掩是:0x7C000x03E00x001F,而在565格式下,它们则别为0xF8000x07E00x001F。你在取一个像素之后,可以分用掩上像素,从而提取出想要的色分量(当然要再经过适当的左右移操作)。在NT中,没有格式限制,只不要求掩不能有重叠。(注:这种格式的像使用起来是比的,不它的示效果接近于真彩,而像数据又比真彩像小的多,所以,它更多的被用于游戏软件)。
biBitCount=24 表示位最多有224种颜色。这种没有色板(bmiColors尺寸0),在位数中,3个字代表一个象素,分别对应RGB
biBitCount=32 表示位最多有232种颜色。这种构与16位位图结构非常似,当biCompressionBI_RGB,它也没有色板,32位中有24位用于存放RGB序是:最高位保留,8位、绿8位、8位。这种格式也被成888 32。如果 biCompressionBI_BITFIELDS,原来色板的位置将被三个DWORD量占据,成为红绿,分用于描述绿分量在32位中所占的位置。在Windows 95(or 98)中,系只接受888格式,也就是三个掩将只能是:0xFF00000xFF000xFF。而在NT中,你只要注意使掩生重叠就行。(注:这种图像格式比较规整,因它是DWORD对齐的,所以在内存中汇编级的代码优化(简单))。
(3) ClrUsed
BITMAPINFOHEADER构中的成ClrUsed指定实际使用的色数目。如果ClrUsed置成0,位使用的色数目就等于biBitCount成中的数目。注意,如果ClrUsed不是可用色的最大或不是0时应该注意色板尺寸的算,比如在4位位中,色板的缺省尺寸应该16sizeof(RGBQUAD),但是,如果ClrUsed不是16或者不是0,那么调色板的尺寸就应该ClrUsedsizeof(RGBQUAD)
(4) 象数据压缩
① BI_RLE8个象素8比特的RLE压缩编码,可使用编码方式和绝对方式中的任何一种进压缩方式可在同一幅中的任何地方使用。
编码方式:由2个字节组成,第一个字指定使用相同色的象素数目,第二个字指定使用的色索引。此外,个字节对中的第一个字0合使用第二个字表示:
  • 第二个字值为0:行的束。
  • 第二个字值为1束。
  • 第二个字值为2:其后的两个字表示下一个象素从当前始的水平和垂直位置的偏移量。
绝对方式:第一个字节设0,而第二个字节设0x030xFF的一个。在这种方式中,第二个字表示跟在个字后面的字数,个字包含个象素的色索引。压缩数据格式需要字(word boundary)对齐。下面的例子是用16制表示的8-压缩图象数据:
03 04 05 06 00 03 45 56 67 00 02 78 00 02 05 01 02 78 00 00 09 1E 00 01
压缩数据可解释为
压缩数据
展数据
03 04
04 04 04
05 06
06 06 06 06 06
00 03 45 56 67 00
45 56 67
02 78
78 78
00 02 05 01
从当前位置右移5个位置后向下移一行
02 78
78 78
00 00
09 1E
1E 1E 1E 1E 1E 1E 1E 1E 1E
00 01
RLE编码图
② BI_RLE4个象素4比特的RLE压缩编码,同也可使用编码方式和绝对方式中的任何一种进压缩方式也可在同一幅中的任何地方使用。方式是:
编码方式:由2个字节组成,第一个字指定象素数目,第二个字包含两种颜色索引,一个在高4位,另一个在低4位。第一个象素使用高4位的色索引,第二个使用低4位的色索引,第3个使用高4位的色索引,依此推。
绝对方式:个字节对中的第一个字节设0,第二个字包含有色索引数,其后包含有色索引,色索引存放在的高、低4位中,一个色索引对应一个象素。此外,BI_RLE4也同样联合使用第二个字中的表示:
  • 第二个字值为0:行的束。
  • 第二个字值为1束。
  • 第二个字值为2:其后的两个字表示下一个象素从当前始的水平和垂直位置的偏移量。
下面的例子是用16制数表示的4-压缩图象数据:
03 04 05 06 00 06 45 56 67 00 04 78 00 02 05 01 04 78 00 00 09 1E 00 01
压缩数据可解释为
压缩数据
展数据
03 04
0 4 0
05 06
0 6 0 6 0
00 06 45 56 67 00
4 5 5 6 6 7
04 78
7 8 7 8
00 02 05 01
从当前位置右移5个位置后向下移一行
04 78
7 8 7 8
00 00
09 1E
1 E 1 E 1 E 1 E 1
00 01
RLE
3. 彩色表
彩色表包含的元素与位所具有的色数相同,象素的色用RGBQUAD构来定24-位真彩色象就不使用彩色表(同也包括16位、和32位位),因中的RGB就代表了个象素的色。彩色表中的色按色的重要性排序,可以驱动程序不能示足色数的设备显示彩色象。RGBQUAD构描述由RGB对强成的色,定如下:
typedef struct tagRGBQUAD { /* rgbq */
BYTE rgbBlue;
BYTE rgbGreen;
BYTE rgbRed;
BYTE rgbReserved;
} RGBQUAD;
 
其中:
rgbBlue
指定
rgbGreen
指定绿
rgbRed
指定
rgbReserved
保留,0
4. 位数据
跟在彩色表之后的是象数据字节阵列。象的描行由表示象象素的连续的字节组成,一行的字数取决于象的色数目和用象素表示的度。描行是由底向上存的,就是列中的第一个字表示位左下角的象素,而最后一个字表示位右上角的象素。(只针对与倒向DIB,如果是正向DIB则扫描行是由向下存的),倒向DIB的原点在像的左下角,而正向DIB的原点在像的左上角。同描行的字数必需是4的整倍数,也就是DWORD对齐的。如果你想确保像的描行DWORD对齐,可使用下面的代
(((width*biBitCount)+31)>>5)<<2
5. 参考
象文件格式(上、下)—Windows程》
像文件格式大全》
Programming Windows by Charles Petzold
二,实例分析
BMP格式像文件<作者:LEFE>
首先注意所有的数在存上都是按高位放高位、低位放低位的原,如12345678h放在存器中就是7856 3412)。下出来的画的第一张图加上文件后的16制数据,以此行分析。T408中的像有点怪,像是在电脑上看是垂直翻的。在分析中化叙述,以一个字(两个字,如424D就是一个字)序号行,“h”表示是16制数。
424D 4690 0000 0000 0000 4600 0000 2800 0000 8000 0000 9000 0000 01001000 0300
0000 0090 0000 A00F 0000 A00F 0000 0000 0000 0000 000000F8 0000 E007 0000 1F00
0000 0000 000002F1 84F1 04F1 84F1 84F1 06F2 84F1 06F2 04F2 86F2 06F2 86F2 86F2
......
BMP文件可分四个部分:位文件、位信息、彩色板、像数据列,在上中已用*分隔。
一、像文件
11像文件424Dh=’BM’,表示是Windows支持的BMP格式。
2
2-3:整个文件大小。4690 000000009046h=36934
3
4-5:保留,必须设0
4
6-7:从文件始到位数据之的偏移量。4600 000000000046h=70,上面的文件就是35=70
5
8-9:位图图信息头长度。
6
10-11:位图宽度,以像素为单位。8000 000000000080h=128
7
12-13:位高度,以像素为单位。9000 000000000090h=144
8
14:位的位面数,该值总101000001h=1
二、位信息
915个像素的位数。有1色),416色),8256色),1664K色,高彩色),2416M色,真彩色),324096M色,增型真彩色)。T408支持的是16位格式。10000010h=16
1016-17压缩说明:有0(不压缩),1RLE 88RLE压缩),2RLE 44RLE压缩3Bitfields,位域存放)。RLE简单是采用像素数+像素的方式压缩T408采用的是位域存放方式,用两个字表示一个像素,位域分配r5b6g50300 000000000003h=3
1118-19:用字数表示的位数据的大小,数必4的倍数,数上等于位图宽×高度×个像素位数。0090 000000009000h=80×90×2h=36864
12
20-21:用象素/米表示的水平分辨率。A00F 00000000 0FA0h=4000
13
22-23:用象素/米表示的垂直分辨率。A00F 00000000 0FA0h=4000
14
24-25:位使用的色索引数。设为0则说明使用所有色板
15
26-27对图示有重要影响的色索引的数目。如果是0,表示都重要。
三、彩色板
1628-35:彩色板范。色板中的个表,用下述方法来描述RGB
1
用于色分量
1
用于绿色分量
1
用于色分量
1
用于填充符(0)
24-位真彩色像就不使用彩色表,因中的RGB就代表了个象素的色。但是16r5g6b5位域彩色像需要彩色表,看前面的,与上面的解不太得上,以下面的解释为准。
中彩色板00F8 0000 E007 0000 1F00 0000 0000 0000,其中:
00F8 0000
F800h=1111100000000000(二制),是色分量的掩
E007 0000
07E0h=0000011111100000(二制),是绿色分量的掩
1F00 0000001Fh=0000000000011111(二制),是色分量的掩
0000 0000
总设0
将掩跟像素值进运算再行移位操作就可以得到各色分量。看看掩,就可以明白事上在个像素的两个字16位中,按从高到低取565位分就是rgb分量。取出分量后把rgb乘以848就可以补齐每个分量一个字,再把三个字rgb合,放入存器(同要反序),就可以转换为24BMP格式了。
四、像数据
17)36-...:两个字表示一个像素。列中的第一个字表示位左下角的象素,而最后一个字表示位右上角的象素。
按照前述r5g6b5彩色板范,我们对图像最左下角手机上像的的像素在24位模式中的rgb值进行推算(由于垂直翻个像素在手机上看来实际上在左上角):
02F1
F102h
r=(F102 AND F800)/ 800 × 8 h= F0h=240
g=(F102 AND 07E0)/ 20 × 4 h=20h=32
b=(F102 AND 001F)× 8 h= 10h=16
rgb=F02010h,放在存
器中1020F0h。
在Photoshop中
一下色,rgb取240、32、16可以看到是近色。
分享到:
评论

相关推荐

    BMP格式详解 详尽解析BMP图像格式

    详细解析BMP图像格式 详细解析BMP图像格式 详细解析BMP图像格式

    bmp图像结构详解 多媒体 图像

    这是bmp图像结构详解,介绍得非常清楚 有需要的朋友下载吧

    BMP文件分析及用python读取

    BMP图像文件(Bitmap-File)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以后的BMP文件都是指设备无关位图(DIB,device-independent bitmap)。BMP位图...

    mfc 图像格式转换 RAW 转换 BMP

    在VS编程环境下,用面向对象的程序设计方法,对所给图像实现RAW格式图像文件的读取,并将其转换为BMP格式文件存储。 试过一些图片可以,一些不行

    bmp文件格式介绍

    bmp文件格式介绍。详细介绍了bmp图像格式的数据结构,非常好的资源。

    BMP.rar_BMP解析_bmp 图像处理

    这是一款图像处理小程序,一个用VC编写的BMP图像解析程序!

    单色bmp图像数据提取程序

    处理单色bmp位图文件,将bmp图像转换为C数组,其中前2字节为图片的长和宽,后续数据为按行(或列)排列的点列数据,生成的数据可用于嵌入式处理器快速图像解析或显示处理。

    BMP图片解析软件

    本软件目前只支持8位、16位和24位的BMP图片,至于其他格式图片,暂不支持。在后面我将会实时进行软件升级,谢谢大家的支持!

    bmp显示,旋转及prn转化

    基于vs2008开发,可以旋转bmp文件90度,在软件上显示bmp,和将1bit,2bit的prn文件解析为相应的bmp。

    BMP图像解析 BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成

    详细的解析了BMP图像(BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。)

    读取BMP格式的图像

    本程序完整的描述了怎么读取一幅bmp格式的图像,还包括怎么保存一幅图像,为图像处理的入门程序,也很关键的一步怎么读取需要处理的图像。

    DICOM图像相关文档

    DICOM图像与BMP图像的转换研究 DICOM图像在PC机上的显示编辑和演示方法研究 DICOM信息读取接口设计 DICOM医学数字图像格式与BMP通用图像格式转换软件的设计与实现 DICOM医学图像文件格式 DICOM医学图像文件格式解析...

    Linux jpg转bmp

    centos7下jpg图像转bmp,调用的是libjpeg-turbo库,代码齐全。解析为bmp时,bmp需要4字节对齐,这里我的做法是,假如一个jpg的tup宽度是157,我这边是将图片扩展为160个像素。代码语言C++

    BMP位图文件解析

    步骤:(1) 读取文件信息,以二进制方式打开并读取位图文件信息复制给新的变量后关闭文件;...(5) bmp数据存储时按行从左到右、按列从下到上扫描,所以对于24位bmp文件,数据区前三个字节代表位图左下角第一个元素;

    VC++ 预览BMP图像

    VC,c++ 解析BMP图像,打开并预览

    arm平台framebuffer,bmp图像显示

    arm 平台下,实现bmp解析,并且通过framebuffer显示 framebuffer 函数已经做成接口

    Camera Hal3添加水印功能的bmp格式图像

    android camera hal3在添加水印功能时需要yuv420sp格式的图像转换才能合成图像,所以需要去解析bmp或者其他格式的图像,在转换成yuv420sp格式。所以提供一份32x24分辨率格式bmp的图像资源。

    stm32f103的bmp图片显示

    由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。BMP虽然是图片格式,但底层仍然是二进制文件。若要将二进制文件解析成图片,需要明确每一...

    三分钟解析24位真彩BMP格式文件

    NULL 博文链接:https://wojiaolongyinong.iteye.com/blog/1896092

Global site tag (gtag.js) - Google Analytics