BMP文件格式详解

BMP文件格式,又称为Bitmap(位图)或DIB(设备无关位图),是Windows系统中广泛使用的图像文件格式。由于它可以不作任何变换地保存图像像素域的数据,因此成为我们取得RAW数据的重要来源。Windows的图形用户界面也在它的内建图像子系统GDI中对BMP格式提供了支持。

BMP文件的数据按照从文件头开始的先后顺序分为四个部分:

bmp文件头:提供文件的格式、大小等信息

位图信息头:提供图像数据的尺寸、位平面数、压缩方式、颜色索引等信息

调色板:可选,如使用索引来表示图像,调色板就是索引与其对应的颜色的映射表

位图数据:就是图像数据

数据段名称对应的windows结构体定义大小(byte)
bmp文件头BITMAPFILEHEADER14
位图信息头BITMAPINFOHEADER40
调色板 由颜色索引数决定
位图数据 由图像尺寸决定

一般见到的图像以24位图像为主,即R、G、B三种颜色各用8个bit来表示,这样的图像我们称为真彩色,这种情况不需要调色板,也就是位图信息头后面紧跟的就是位图数据了,因此常见到一种说法:位图文件从文件头开始偏移54 个字节就是位图数据了,这其实说的是24或32位图的情况。这也就解释了我们按照这种程序写出来的程序为什么对某些位图文件没用了。

以一个16位位图文件说明,它是含有调色板的。

1.在BMP文件中,如果一个数据需要几个字节来表示的话,那么该数据的存放字节顺序为“低地址存放低位数据,高地址存放高位数据”。如数据0x1756在内存中存储顺序为:

5617

---------------------------------》地址变大(小端方式存储)

2.分析数据

(1)bmp文件头,windows为bmp文件头定义了如下结构体:

typedef struct tagBITMAPFILEHEADER

{

UINT16 bfType;

DWORD bfSize;

UINT16 bfReserved1;

UINT16 bfReserved2;

DWORD bfOffBits;

}BITMAPFILEHEADER;

变量名地址偏移大小作用
bfType0000h2 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

bfSize0002h4 bytes说明该位图文件的大小,用字节为单位
bfReserved10006h2 bytes保留,必须设置为0
bfReserved20008h2 bytes保留,必须设置为0
bfOffBits000Ah4 bytes

说明从文件头开始到实际的图像数据之间的字节的偏移量

 

对照文件数据我们看到:

1-2:424dh = ‘BM’,表示这是Windows支持的位图格式。有很多声称开头两个字节必须为‘BM’才是位图文件,从上表来看应为

          开头两个字节必须为‘BM’才是Windows位图文件。

3-5:00010436h = 66614B = 65.15KB,通过查询文件属性发现一致。

6-9:这是两个保留段,为0

A-D:00000436h = 1078,即从文件头到位图数据需偏移1078字节

共14个字节

(2)位图信息头

Windows为位图信息头定义了如下结构体:

typedef struct tagBITMAPINFOHEADER

{

DWORD biSize;

LONG biWidth;

LONG biHeight;

WORD biPlanes;

WORD biBitCount;

DWORD biCompression;

DWORD biSizeImage;

LONG biXPelsPerMeter;

LONG biYPelsPerMeter;

DWORD biClrUsed;

DWORD biClrImportant;

}BITMAPINFOHEADER;

变量名地址偏移大小作用
biSize000Eh4 bytesBITMAPINFOHEADER结构所需要的字数
biWidth0012h4 bytes说明图像的宽度,用像素为单位
biHeight0016h4 bytes

说明图像的高度,用像素为单位

注:如果该值是一个正数,说明图像是倒向的,如果该值是

        一个负数,则说明图像是正向的。

大多数的BMP文件都是倒向的位图,也就是高度值是一个正数

biPlanes001Ah2 bytes为目标设备说明颜色平面数,其值将总是设为1
biBitCount001Ch2 bytes说明比特数/像素,其值为1、4、8、16、24或32
biCompression001Eh4 bytes

说明图像数据压缩的类型,取值范围:

0 BI_RGB 不压缩,最常用

1 BI_RLE8 8比特游程编码,只用于8位位图

2 BI_RLE4 4比特游程编码,只用于4位位图

3 BI_BITFIELDS 比特域,用于16/32位位图

4 BI_JPEG JPEG 位图含JPEG图像 仅用于打印机

5 BI_PNG PNG 位图含PNG图像 仅用于打印机

biSizeImage0022h4 bytes

说明图像大小

以字节为单位,当用BI_RGB格式时,可设置为0

biXPelsPerMeter0026h4 bytes说明水平分辨率,用像素/米表示,有符号整数
biYPelsPerMeter002Ah4 bytes说明垂直分辨率,用像素/米表示,有符号整数
biClrUsed002Eh4 bytes

说明位图实际使用的彩色表中的颜色索引数

设为0的话,则说明使用所有调色板项

biClrImportant0032h4 bytes

说明对图像显示有重要影响的颜色索引的数目

如果是0,表示都重要

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值