三分钟解析24位真彩BMP格式文件 - 推酷
时间:2025-04-06
时间:2025-04-06
http:///articles/FvaIVj1/7
000000XX0h 是用来方面看数据的(也可以方便记数),比如数据表的第一行的第三个字节数据 9E 的位置就是 00000000h + 2 = 00000002h ,这就是为什么在一些解释中定位中使用000000XXXh 的原因。
我们可以看到数据表被三种颜色的线条划分为 16 个部分:
1~4 部分(红色线划分)是位图文件头;
5~15 部分(开始用蓝色线条划分部分)是位图信息头;
16 部分(既就是用绿色线划分的后面所有数据)是位图的字节阵列;
如上所说,因为是 24 位真彩图,所以不存在彩色表。下来详细说明每一部分代表什么含义:
(首先在这里强调一下!!!!在上图中的字节数据中,拿第二部分表示文件大小的字节数据( 9E 40 09 00 )来说,其 16 进制真正的顺序和上面显示的是相反的,即就是上图表示的文件大小为 0009499E (用 16 进制表示),因此在读取文件数据操作时,就就需要注意了!!!!)
1~4 部分(位图文件头):
1: 42 4D 这是 BMP 文件的标示,是 ASCII 的 BM 的 16 进制的值;(大小: 2byte )
2 : 9E 40 09 00 用字节表示的整个文件的大小;(大小: 4 byte = 1 dword ) 3 : 00 00 00 00 保留,设置为 0 ;(大小: 4 byte = 1 dword )
4 : 36 00 00 00 从文件开始到位图数据开始之间的数据 (bitmap data) 之间的偏移量;(大小: 4 byte = 1 dword )
5~15 部分(位图信息头):
5 : 28 00 00 00 位图信息头 (Bitmap Info Header) 的长度;(大小: 4 byte = 1dword )
6 : F7 01 00 00 位图的宽度,以像素为单位;(大小: 4 byte = 1 dword )(它的16 进制大小应反过来,所以 10 进制大小是 503 )
7 : 91 01 00 00 位图的高度,以像素为单位;(大小: 4 byte = 1 dword ) 8 : 01 00 位图的位面数;(大小: 2 byte = 1 word )
9 : 18 00 每个像素的位数;(大小: 2 byte = 1 word )
10 : 00 00 00 00 压缩说明( 0 表示不压缩)(大小: 4 byte = 1 dword )
11 : 68 40 09 00 用字节数表示的位图数据的大小。该数必须是 4 的倍数(至于为什么下面会有解释)(大小: 4 byte = 1 dword )
12 : C4 0E 00 00 用像素 / 米表示的水平分辨率;(大小: 4 byte = 1 dword ) 13 : C4 0E 00 00 用像素 / 米表示的垂直分辨率;(大小: 4 byte = 1 dword ) 14: 00 00 00 00 位图使用的颜色数;(大小: 4 byte = 1 dword )
http:///articles/FvaIVj2/7
15 : 00 00 00 00 指定重要的颜色数。当该域的值等于颜色数时,表示所有颜色都一样重要;(大小: 4 byte = 1 dword )
16 部分(位图字节阵列):
16 :从上面的绿色划分线以后均为字节阵列数据,用于绘制。而且每三个字节表示一个像素。
描述完了上述的图的分块含义,现在就说一说 BMP 中的一些需要注意的方面,首先在位图字节阵列数据中 BMP 存储的图像数据是 从左下角的像素开始 ,到最后的右上角像素。其中还有一个比较主要的概念,而且与绘图读取数据有关的概念是 “ 扫描行 ” ;
扫描行:扫描行指图像在存储器中一行像素的字节数据, 图像扫描行的大小,取决于图象的颜色数目和用象素表示的图象宽度。 BMP 格式还有个非常重要的规定:要求每一扫描行的字节数据必须能被 4 整除,也就是 dword 对齐( dword 是一种数据类型,长度为 4 个字节)。如果图像的一行字节数不能被 4 整除,就需要在每行的末尾补齐 0 以达到规定。
因此在我们的读取数据中需要根据 BMP 图像的宽度来判断是否被补 0 ,判断方法就是先判断一行的字节数是否可以被 4 整除,如果整除则不需要补 0 ,如果没有整除,则求出补的0 的个数(具体计算方法是, bu_0_number = width( 像素 ) * 3 % 4 ),那么就知道在每一行的末尾都补了 bu_0_number 个 0 ,因此我们在读取时绘制图片时就要忽略这些数据。(补充:求每一行的字节数 size = width * 3 )
经过上面分析,我们已经可以着手写程序了,因为整个过程已经在我们脑袋中了。首先从上面可以看出,位图文件头部分的数据只有宽度和高度部分的数据对我们有作用(对于我们已经知道需要解析的图片是 24 位真彩 BMP 图片),下来有用的就是位图字节阵列部分的数
据,里面每三个代表一个像素的 RGB 值(里面补 0 的部分忽略),字节存储的图片像素的顺序是从左下到右上,这样我们只需要读一组 RGB 值设置画笔颜色,然后绘制一个像素;读一组 RGB 值设置颜色再绘制一个像素就可以了 ......
上面均是自己在解析过程中的思考过程,其实BMP也好其他什么文件格式的也好,对于我们来说,我们只在字节的角度去看它,我们需要知道的只是规则,如果没有,那我们就制定规则。
自己也实现了一个附在下面,但是存在一个问题就是,当文件比较大时,读取速度很慢。。。。这就是需要考虑的。。。。
下面附上一张解析的24位BMP图:
http:///articles/FvaIVj3/7
15-4-9
三分钟解析24位真彩BMP格式文件 - 推酷 赞一个 收 藏
推荐文章
1.2.3.4.5.6.我来评几句
请输入评论内容...
登录后评论
已发表评论数(0)
搜索文章
http:///articles/FvaIVj
4/7
15-4-9三分钟解析24位真彩BMP格式文件 - 推酷
相关站点
+ 订阅
相关主题
技术热门文章
http:///articles/FvaIV …… 此处隐藏:743字,全部文档内容请下载后查看。喜欢就下载吧 ……