BMP文件结构简述

news/2024/7/8 6:08:29 标签: struct, 数据结构, bi, windows, 图形

BMP文件结构简述

 

1. BMP文件组成
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。

 

2. BMP文件头
BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。

其结构定义如下:

typedef struct tagBITMAPFILEHEADER
{
 WORDbfType;   // 位图文件的类型,必须为BM
 DWORD   bfSize;   // 位图文件的大小,以字节为单位
 WORDbfReserved1;  // 位图文件保留字,必须为0
 WORDbfReserved2;  // 位图文件保留字,必须为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. 颜色表

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

typedef struct tagRGBQUAD
{
 BYTErgbBlue;// 蓝色的亮度(值范围为0-255)
 BYTErgbGreen;   // 绿色的亮度(值范围为0-255)
 BYTErgbRed; // 红色的亮度(值范围为0-255)
 BYTErgbReserved;// 保留,必须为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;

 


http://www.niftyadmin.cn/n/1691603.html

相关文章

一款真正可以用于爬百度图片的爬虫python代码,自己改进的!!

我用的pycharm,有三种注释方式:1.用 一对""" 括起来要注释的代码块。2.用一对括起来要注释的代码块。3.选中要注释的代码,按下ctrl/注释。 由于深度学习训练或者数据分析需要大量数据,其中获取数据的方法有很多&a…

org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection

如果MySQL版本是8.0及以上, 驱动mysql-connector-java的version8.0 hibernate需注意: 1.hibernate.version5.3.7.Final或以上 2.driverClass“com.mysql.cj.jdbc.Driver” 3.jdbcUrljdbc:mysql://localhost:3306/maven?useSSLfalse&serverTime…

对于多复杂数据的插值最优方法---拉格朗日插值法。

拉格朗日插值法(图文详解) 在数值分析中,拉格朗日插值法是以法国十八世纪数学家约瑟夫拉格朗日命名的一种多项式插值方法。许多实际问题中都用函数来表示某种内在联系或规律,而不少函数都只能通过实验和观测来了解。如对实践中的某个物理量进行观测&…

brew数据压缩的实现

最近在做手机RPG游戏,涉及到的数据文件和图片文件非常多,于是进行压缩解压缩。做下笔记摘要。很多部分参考了前人的笔记,感谢前人给了肩膀站站 :] 一、主体思路:1、将目标文件按GZIP格式压缩成压缩文件。2、把压缩文件…

对比学习用 Keras 搭建 CNN RNN 等常用神经网络和其后端切换(Theano和TensorFlow)

参考: 各模型完整代码 周莫烦的教学网站 这个网站上有很多机器学习相关的教学视频,推荐上去学习学习。 Keras 是一个兼容 Theano 和 Tensorflow 的神经网络高级包, 用他来组件一个神经网络更加快速, 几条语句就搞定了. 而且广泛的兼容性能使 Keras 在 Wi…

BREW内存调试输出信息

BREW内存调试输出信息 在VC上调试BREW应用时,DEBUG窗口提示很多如[1]信息,及少量如[2]信息:*AEEkHeap.c:1236 - h1: invalid HNode 0x2F85F74, reason 5 【1】*OEMOS.c:747 - BPOINT Type 3, Address: 0x02F86608 【2】通过Google搜索了好久&#xff0c…

python链式调用顺序_一日一技:在Python里面实现链式调用

一日一技:在Python里面实现链式调用我们在使用Django的models查询数据库时,可以看到有这种写法:form app.models import XXXquery XXX.objects.all()query query.filter(name123, age456).filter(salary999)在这种写法里面,quer…