博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bmp位图分析
阅读量:5839 次
发布时间:2019-06-18

本文共 1760 字,大约阅读时间需要 5 分钟。

hot3.png

这里简单描述下之前文章中()光标图像用到的解析位图。

1.bmp位图格式

为了更容易了解bmp,咱先用个纯黑色的bmp图片为例:
ultraEdit打开,16进制如下:

00000000h: 42 4D D2 09 00 00 00 00 00 00 36 00 00 00 28 00 ; BM?......6...(.00000010h: 00 00 36 00 00 00 0F 00 00 00 01 00 18 00 00 00 ; ..6.............00000020h: 00 00 9C 09 00 00 C4 0E 00 00 C4 0E 00 00 00 00 ; ..?..?..?....00000030h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................00000040h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ................00000050h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ; ......................//省略下面......

前面54个字节表示头:

00000000h: 42 4D D2 09 00 00 00 00 00 00 36 00 00 00 28 00 ; BM?......6...(.00000010h: 00 00 36 00 00 00 0F 00 00 00 01 00 18 00 00 00 ; ..6.............00000020h: 00 00 9C 09 00 00 C4 0E 00 00 C4 0E 00 00 00 00 ; ..?..?..?....00000030h: 00 00 00 00 00 00

其中第16-19个字节表示位图长00 00 00 36(十进制54),20-23个字节表示宽00 00 00 0F(十进制15);

像素个数=长*宽=54*15=810
图像总大小=像素个数*3(3个字节表示一个像素点,分别为r,g,b)+头=810*3+54=2430+54=2484
(注:但这张图片的实际大小是2514字节,少了30个字节,这不科学╮(╯▽╰)╭。有哪位朋友知道告诉我下,谢谢)

这个计算方法应该是没有错误的,我这里再发个图片,大家可以按照这个方法来计算下

实际大小:1206字节=12*32*3+54=1152+54=1206
长:12
宽:32

好了,这里大家应该简单知道bmp位图的各个表示含义了。接下来就是就转成带透明色的32位位图:

其实刚才已经说过了,bmp是3个字节表示一个像素,分别为(r,g,b),而这里我们就是要在每个像素里增加一个alpha位,
变成(r,g,b,a),所以位图大小会变成:长*宽*4
透明色:我自己的理解是透明色只是相对的,当你要把图片里面的黑色部分完全透明掉的话:00 00 00(表示黑色),可以
直接00 00 00 00;否则则为:00 00 00 ff.下面给出我android里面的一个代码:

//buffer第54个后的为图像数据				byte[] by1=Arrays.copyOfRange(buffer, 54, buffer.length);								//24位图转32位,由于bmp存储是从后面往前面,所以需要倒序进行转换				byte[] by2=new byte[width*height*4];				for(int j=0;j

最后有个有意思的地方就是:bmp存储数据是倒序的,解析数据时必须从后面往前面。

给出一个测试建议:

在位图16进制里前面部分修改数据,如00改成ff等,你会发现在位图的左下角有其他像素(红绿蓝等)

这里我有个疑问:

既然是倒序存储的为什么不是从右下角出现修改后的其他像素呢?

要是有朋友知道,希望不吝赐教,thks,O(∩_∩)O~

转载于:https://my.oschina.net/blackylin/blog/87532

你可能感兴趣的文章
SQL server查看触发器是否被禁用
查看>>
[C++基础]在构造函数内部调用构造函数
查看>>
跟随我在oracle学习php(8)
查看>>
Spring 3.1.0 Hibernate 3.0 Eclipse Spring WEB例子
查看>>
使用Unicode写文本文件:一个简单类的示例
查看>>
UVA-10212 The Last Non-zero Digit. 分解质因子+容斥定理
查看>>
求两个集合的交集,并集,差集
查看>>
Kotlin的语法糖(一)基础篇
查看>>
OkHttp源码分析
查看>>
让你的app体验更丝滑的11种方法!冲击手机应用榜单Top3指日可待
查看>>
windows kernel exploitation基础教程
查看>>
NS_OPTIONS枚举的用法
查看>>
java9系列(九)Make G1 the Default Garbage Collector
查看>>
QAQ高精度模板笔记√
查看>>
Jmeter计数器的使用-转载
查看>>
【Android笔记】入门篇02:全屏设置和禁止横屏竖屏切换
查看>>
4. Median of Two Sorted Arrays
查看>>
Linux 虚拟机忘记root密码
查看>>
Kubernetes的本质
查看>>
PL/SQL developer 管理多套数据库
查看>>