BMP图像数据格式详解

摘要:
一.简介BMP图形文件是Windows采用的图形文件格式,在Windows环境下运行的所有图象处理软件都支持BMP图象文件格式。Windows3.0以前的BMP图文件格式与显示设备有关,因此把这种BMP图象文件格式称为设备相关位图DDB文件格式。大多数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作扩展名)。
二.BMP格式结构
BMP文件的数据按照从文件头开始的先后顺序分为四个部分:
位图文件头(bmp file header)提供文件的格式、大小等信息
位图信息头(bitmap information)提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息
调色板(color palette)可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表
位图数据(bitmap data)图像数据区
BMP图片文件数据表如下:
数据段名称
大小(byte)
开始地址
结束地址
位图文件头(bitmap-file header)
14
0000h
000Dh
位图信息头(bitmap-information header)
40
000Eh
0035h
调色板(color table)
由biBitCount决定
0036h
未知
图片点阵数据(bitmap data)
由图片大小和颜色定
未知
未知
三.BMP文件头
BMP文件头结构体定义如下:
typedef structtagBITMAPFILEHEADER
{
UINT16 bfType; //2Bytes,必须为"BM",即0x424D才是Windows位图文件
DWORDbfSize; //4Bytes,整个BMP文件的大小
UINT16 bfReserved1; //2Bytes,保留,为0
UINT16 bfReserved2; //2Bytes,保留,为0
DWORDbfOffBits; //4Bytes,文件起始位置到图像像素数据的字节偏移量
}BITMAPFILEHEADER;
BMP文件头数据表如下:
变量名
地址偏移
大小
作用说明
bfType
0000h
2Bytes
文件标识符,必须为"BM",即0x424D才是Windows位图文件
‘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”就行
bfSize
0002h
4Bytes
整个BMP文件的大小(以位B为单位)
bfReserved1
0006h
2Bytes
保留,必须设置为0
bfReserved2
0008h
2Bytes
保留,必须设置为0
bfOffBits
000Ah
4Bytes
说明从文件头0000h开始到图像像素数据的字节偏移量(以字节Bytes为单位),以为位图的调色板长度根据位图格式不同而变化,可以用这个偏移量快速从文件中读取图像数据
四.BMP信息头
BMP信息头结构体定义如下:
typedef struct_tagBMP_INFOHEADER
{
DWORD biSize;//4Bytes,INFOHEADER结构体大小,存在其他版本I NFOHEADER,用作区分
LONGbiWidth; //4Bytes,图像宽度(以像素为单位)
LONGbiHeight; //4Bytes,图像高度,+:图像存储顺序为Bottom2Top,-:Top2Bottom
WORDbiPlanes; //2Bytes,图像数据平面,BMP存储RGB数据,因此总为1
WORDbiBitCount; //2Bytes,图像像素位数
DWORD biCompression;//4Bytes,0:不压缩,1:RLE8,2:RLE4
DWORD biSizeImage;//4Bytes,4字节对齐的图像数据大小
LONGbiXPelsPerMeter; //4 Bytes,用象素/米表示的水平分辨率
LONGbiYPelsPerMeter; //4 Bytes,用象素/米表示的垂直分辨率
DWORD biClrUsed;//4 Bytes,实际使用的调色板索引数,0:使用所有的调色板索引
DWORD biClrImportant;//4 Bytes,重要的调色板索引数,0:所有的调色板索引都重要
}BMP_INFOHEADER;
BMP信息头数据表如下:
变量名
地址偏移
大小
作用说明
biSize
000Eh
4Bytes
BNP信息头即BMP_INFOHEADER结构体所需要的字节数(以字节为单位)
biWidth
0012h
4Bytes
说明图像的宽度(以像素为单位)
biHeight
0016h
4Bytes
说明图像的高度(以像素为单位)。这个值还有一个用处,指明图像是正向的位图还是倒向的位图,该值是正数说明图像是倒向的即图像存储是由下到上;该值是负数说明图像是倒向的即图像存储是由上到下。大多数BMP位图是倒向的位图,所以此值是正值。
biPlanes
001Ah
2Bytes
为目标设备说明位面数,其值总设置为1
biBitCount
001Ch
2Bytes
说明一个像素点占几位(以比特位/像素位单位),其值可为1,4,8,16,24或32
biCompression
001Eh
4Bytes
说明图像数据的压缩类型,取值范围为:
0BI_RGB 不压缩(最常用)
1BI_RLE8 8比特游程编码(BLE),只用于8位位图
2BI_RLE4 4比特游程编码(BLE),只用于4位位图
3BI_BITFIELDS比特域(BLE),只用于16/32位位图
4
biSizeImage
0022h
4Bytes
说明图像的大小,以字节为单位。当用BI_RGB格式时,总设置为0
biXPelsPerMeter
0026h
4Bytes
说明水平分辨率,用像素/米表示,有符号整数
biYPelsPerMeter
002Ah
4Bytes
说明垂直分辨率,用像素/米表示,有符号整数
biClrUsed
002Eh
4Bytes
说明位图实际使用的调色板索引数,0:使用所有的调色板索引
biClrImportant
0032h
4Bytes
说明对图像显示有重要影响的颜色索引的数目,如果是0,表示都重要。
五.BMP调色板
BMP调色板结构体定义如下:
typedef struct_tagRGBQUAD
{
BYTE rgbBlue; //指定蓝色强度
BYTE rgbGreen; //指定绿色强度
BYTE rgbRed; //指定红色强度
BYTE rgbReserved; //保留,设置为0
}RGBQUAD;
1,4,8位图像才会使用调色板数据,16,24,32位图像不需要调色板数据,即调色板最多只需要256项(索引0 - 255)。
颜色表的大小根据所使用的颜色模式而定:2色图像为8字节;16色图像位64字节;256色图像为1024字节。其中,每4字节表示一种颜色,并以B(蓝色)、G(绿色)、R(红色)、alpha(32位位图的透明度值,一般不需要)。即首先4字节表示颜色号1的颜色,接下来表示颜色号2的颜色,依此类推。
颜色表中RGBQUAD结构数据的个数有biBitCount来确定,当biBitCount=1,4,8时,分别有2,16,256个表项。
当biBitCount=1时,为2色图像,BMP位图中有2个数据结构RGBQUAD一个调色板占用4字节数据,所以2色图像的调色板长度为2*4为8字节。
当biBitCount=4时,为16色图像,BMP位图中有16个数据结构RGBQUAD一个调色板占用4字节数据,所以16像的调色板长度为16*4为64字节。
当biBitCount=8时,为256色图像,BMP位图中有256个数据结构RGBQUAD一个调色板占用4字节数据,所以256色图像的调色板长度为256*4为1024字节。
当biBitCount=16,24或32时,没有颜色表。
五.BMP图像数据区
位图数据记录了位图的每一个像素值,记录顺序是在扫描行内是从左到右,扫描行之间是从下到上。位图的一个像素值所占的字节数:
当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;
颜色表接下来位为位图文件的图像数据区,在此部分记录着每点像素对应的颜色号,其记录方式也随颜色模式而定,既2色图像每点占1位(8位为1字节);16色图像每点占4位(半字节);256色图像每点占8位(1字节);真彩色图像每点占24位(3字节)。所以,整个数据区的大小也会随之变化。究其规律而言,可的出如下计算公式:图像数据信息大小=(图像宽度*图像高度*记录像素的位数)/8。

免责声明:文章转载自《BMP图像数据格式详解》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle主键ID设置自动增长(序列+触发器)系统学习NLP(二十一)--SWEM下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(3)mpeg系列——mpeg1和mpeg2

  MPEG是Moving Picture Experts Group的简称。这个名字本来的含义是指一个研究视频和音频编码标准的小组。现在我们所说的MPEG泛指又该小组制定的一系列视频编码标准。该小组于 1988年组成,至今已经制定了MPEG-1、MPEG-2、MPEG-3、MPEG-4、MPEG-7等多个标准,MPEG-21正在制定中。 MPEG到目前为...

Tga图片格式分析以及程序实现

Tga图片格式分析以及程序实现 本文转自本人Blog: Singlerblog.mblogger.cn 继位图之后,我们来看看Tga图片的格式,以及程序实现。   一、  文件格式 Tga常见的格式有非压缩RGB和压缩RGB两种格式,其他格式的我们在这里不做讲述。文件的第三个Byte位作为标记:2为非压缩RGB格式,10为压缩RGB格式。它们的具体格...

wxpython 基本的控件 (按钮)

使用按钮工作 在wxPython 中有很多不同类型的按钮。这一节,我们将讨论文本按钮、位图按钮、开关按钮(toggle buttons )和通用(generic )按钮。   如何生成一个按钮? 在第一部分(part 1)中,我们已经说明了几个按钮的例子,所以这里我们只简短的涉及它的一些基本的东西。图7.4显示了一个简单的按钮。   图7.4 使用按钮...

图像放大算法

http://www.cnblogs.com/celerychen/archive/2010/11/25/3588222.html 一、图像放大算法 图像放大有许多算法,其关键在于对未知像素使用何种插值方式。以下我们将具体分析几种常见的算法,然后从放大后的图像是否存在色彩失真,图像的细节是否得到较好的保存,放大过程所需时间是否分配合理等多方面来比较它们的优...

c语言数字图像处理(一):bmp图片格式及灰度图片转换

本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简单分析,最后的代码可以将8位,16位,24位,32位色彩深度的bmp文件转化位8位灰度图片,用作后续文章中算法的测试图片。 Bmp file structur...

使用局部标准差实现图像的局部对比度增强算法。

图像的对比度增强算法在很多场合都有着重要的应用,特别是在医学图像上,这是因为在众多疾病的诊断中,医学图像的视觉检查时很有必要的。而医学图像由于本身及成像条件的限制,图像的对比度很低。因此,在这个方面已经开展了很多的研究。这种增强算法一般都遵循一定的视觉原则。众所周知,人眼对高频信号(边缘处等)比较敏感。虽然细节信息往往是高频信号,但是他们时常嵌入在大量的低...