bmp图片格式详解

bmp图片格式详解bmp 图片格式详解 1 BMP 文件简介 BMP Bitmap File 图形文件是 Windows 采用的图形文件格式 在 Windows 环境下运行的所有图象处理软件都支持 BMP 图象文件格式 Windows 系统内部各图像绘制操作都是以 BMP 为基础的 windows3 0 以前的 BMP 图文件格式与显示设备有关 因此把这种 BMP 图象文件格式称为设备相关位图 DDB device dependentbit

bmp图片格式详解

1. 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能够在任何类型的显示设备上显示所存储的图象。BMP位图文件默认的文件扩展名是BMP或者bmp(有时它也会以.DIB或.rle作扩展名)。

2. android是如何识别BMP文件的

其实很简单,就是判断前面2个字节是什么,如果发现是BM开始,那就认为它是bmp图片。(注意此处识别的是ASCII码,’B’ ‘M’ 的ASCII码42 4D)

 // SkImageDecoder_libbmp.cpp (external\skia\src\images) static bool is_bmp(SkStream* stream) { static const char kBmpMagic[] = { 'B', 'M' };//此处只有一种情况就是开始2个字节是BM char buffer[sizeof(kBmpMagic)]; return stream->read(buffer, sizeof(kBmpMagic)) == sizeof(kBmpMagic) && !memcmp(buffer, kBmpMagic, sizeof(kBmpMagic)); }

3. BMP图片格式详解

Bmp图片格式组成部分:bmp文件头(14 bytes) + 位图信息头(40 bytes) + 调色板(由颜色索引数决定) + 位图数据(由图像尺寸决定)

3.1 BMP图片的数据源

接着以2进制形式打开该图片,查看图片的2进制原始数据=>

图表 2 bmp图片2进制数据
图表 2 bmp图片2进制数据

我们就以上面bmp文件为例子,讲解我们接下去的内容。

3.2 BMP文件头

bmp文件头占14个字节

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

3.3 位图信息头

位图信息头40 byte
图表 3 位图信息头
图表 3 位图信息头




1) 0xe-0x11:4个字节,位图信息头需要的字节数

例如此处:28 00 00 00 => 28 = 40个字节

2) 0x12-0x15:4个字节,图像宽度,以像素为单位

例如此处:40 01 00 00 => 01 40 = 320宽度

4) 0x1a-0x1b:2个字节,为目标设备说明颜色平面数,其值将总被设为1.

例如此处:01 00 => 1

5) 0x1c-0x1d:2个字节,说明比特数/像素,其值为1、4、8、16、24、32

例如此处:18 00 => 24 说明其是RGB888的24位图(8位位图有256中颜色;24位位图有种颜色,也就是1600万色)

6) 0x1e-0x21:4个字节,说明图像数据压缩类型。

取值范围:

0 => 不压缩(最常用)

1 => 8比特游程编码(RLE),只用于8位位图

2 => 4比特又称编码(RLE),只用于4位位图

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

4 => 位图含JPEG图像(仅用于打印机)

5 => 位图含PNG图像(仅用于打印机)

例如此处:00 00 00 00 => 0 不压缩

7) 0x22-0x25:4个字节,说明图像大小,以字节为单位。当(0x1e-0x21)设置为0不压缩时,此处可以设置为0.

例如此处:00 08 07 00 => 07 08 00 = bytes = 450 kb, 此处比(0x2-0x5)位图文件的大小少了0x36 = 54个bytes,就是少了前面的信息头,仅包含数据。

8) 0x26-0x29:4个字节,说明水平分辨率,用像素/米表示,有符号整数。可以不设置,不设置时是0。

例如此处:00 00 00 00

9) 0x2a-0x2d:4个字节,说明垂直分辨率,用像素/米表示,有符号整数。可以不设置,不设置时是0。

例如此处:00 00 00 00

10) 0x2e-0x31:4个字节,说明位图时间使用的颜色表中的颜色索引数(设置为0的话,则说明使用所有的调色板项,一般与0x1c-0x1d使用的位图数相匹配,一般指多少种颜色)

例如此处:00 00 00 00

11) 0x32-0x35:4个字节,说明对图像显示有重要影响的颜色索引数码(设置为0的话,表示都重要)

例如此处:00 00 00 00

3.4 调色板

3.5 位图数据

1) 由于位图信息头中的位图高度是正的,所以位图数据在文件中的排列顺序是从左下角到右上角,以行为主序排列的。也就是第一个数据(此处指前3个bytes)是图像最后一行第一列像素色彩数据,第二个数据是图像最后一行第二列像素色彩数据。(有效信息从0x36-0x70835大小是0x70800,与0x22-0x25图像大小的值是一致的)

 private static Bitmap createBitmap(DisplayMetrics display, int width, int height, Config config, boolean hasAlpha) { …… if (config == Config.ARGB_8888 && !hasAlpha) { nativeErase(bm.mNativeBitmap, 0xff000000);//一共32位,最前面2位是alpha分量,ff代表不透明 nativeSetHasAlpha(bm.mNativeBitmap, hasAlpha); …… } 至于为什么会反向存储,这个是由于计算机windows x86架构是小端系统,高字节存放在高地址里面。

3) 如果存在调色板,则这些值代表的是调色板的索引序号。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227629.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午8:52
下一篇 2026年3月16日 下午8:52


相关推荐

  • aspectjweaver.jar包下载

    aspectjweaver.jar包下载点击链接https://www.eclipse.org/aspectj/downloads.php点击下载后得到一个jar文件:用解压工具解压:就看到aspectjweaver.jar包了。

    2022年7月12日
    22
  • js数组字符串转数组对象_js数组对象排序

    js数组字符串转数组对象_js数组对象排序js对象使用<script>//js对象是一种无序的集合{}表示varobj={name:”张三”,age:18}//取值console.log(obj.name)//张三console.log(obj[“name”])/…

    2025年11月2日
    4
  • Vue学习之从入门到神经(两万字收藏篇)

    Vue学习之从入门到神经(两万字收藏篇)Vue史诗级教程系列文章,欢迎订阅专栏

    2022年6月4日
    32
  • datagrip 2021 mac 激活码(在线激活)

    datagrip 2021 mac 激活码(在线激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    128
  • 金九银十准备季:Java IO流面试题(含答案)「建议收藏」

    金九银十准备季:Java IO流面试题(含答案)「建议收藏」前言本题集列举了众多IT公司面试真题,对应聘Java程序员职位的常见考点和知识体系都进行的分类和归纳整理。本题集适合应聘Java和JavaEE职位的程序员作为面试复习、学习和强化的资料,也适合其他程序员作为拓展读物进行阅读。本题集包含了常见的算法、面试题,也包含了新的高级技术,比如:微服务架构等技术的面试题目。本题集非常全面,对于工作1-5年左右的java程序员面试有非常好的指导作用。大家也可以访问(直接在线观看最新版的面试题):Java考试_Java笔试题机试题真题讲解_JavaWeb

    2022年5月28日
    36
  • 联盟卡结合异业联盟,如何建立一个完善的联盟生态会员体系?「建议收藏」

    联盟卡结合异业联盟,如何建立一个完善的联盟生态会员体系?「建议收藏」对于我们所认知的联盟,生态就是联盟生态,也就是说,如果我们要做一个联盟卡,然后通过我们的联盟卡去建立我们的会员。那如何来建立呢?分四个方式来讲。首先第一个方式要建立完善的一个会员体系,把这个会员体系给架构起来。如何成为我们平台的会员,以及说成有平台会员之后可以享受平台的一种权益。再者的话就是如何让我们的会员去帮助我们平台去做裂变,也就是我们经常讨论的一个问题,如何去做分享?那么在这个环节中如何去做一个线上电子权益卡,通过入口让用户可以去购买,或者叫免费卡也行,这个都是由平台去做设定的,开通后可以去享受我们相

    2022年6月15日
    29

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号