【图像】图像格式(3) : BMP

news2024/12/22 16:19:05

1. 背景

BMP可以说是图像中最简单的格式了,没有图像压缩算法,基本可以看做图像的RGB裸数据加了一些基本的metadata构成。
这也导致了bmp的文件一般都是非常的大,除了windows原生的支持之外(从1990年的windows3.0开始),基本找不到什么别的优势了。
但是因为足够简单,我们可以以此作为学习的起点。

2. 特点

  • 基本无压缩
  • 支持8/24/32,支持透明通道
  • 支持直接色和索引色
  • 小端存储

3. 文件组成

取一张bmp图片。
请添加图片描述

组成

组成长度内容
文件头14字节标志,文件长度,数据偏移
DIB头40字节图像长,宽,位深
调色板不定16位色深以上的bmp图不需要
图像数据不定索引色或者直接色

文件头

位于文件开头,共14字节。
请添加图片描述

  • 标志2字节,一般是BM。
    • BM – Windows 3.1x, 95, NT, … etc.
    • BA – OS/2 struct Bitmap Array
    • CI – OS/2 struct Color Icon
    • CP – OS/2 const Color Pointer
    • IC – OS/2 struct Icon
    • PT – OS/2 Pointer
  • 文件长度4字节的,注意读取是小端读取。如图就是0x000c0036 = 786486。
  • 保留位4字节。
  • 数据位偏移4字节,标明图像数据是从哪里开始的。

DIB头

DIB头有多个版本。按照第一个长度不同来进行划分,用的最普遍的是40字节的BITMAPINFOHEADER
在这里插入图片描述

  • DIB头长度:标志DIB头的长度(同样也标志了版本)

  • 位图宽度:4字节,0x00000200=512

  • 位图长度:4字节,0x00000200=512

  • 色彩平面数:2字节,1有效

  • 色深:2字节,典型值是1,4,8,16,24,32

  • 压缩算法:4字节,通常选0无压缩(要压缩我干嘛用bmp呢)。
    在这里插入图片描述

调色板

调色板(color table)是单色、16色和256色(色深1,2,4)bmp图像文件所特有的,相对应的调色板大小是2、16和256
色深16,24,32的bmp没有调色板。
调色板以4字节为单位,每4个字节存放一个颜色值。顺序是 蓝-绿-红-空

换了一张4bit的bmp图

请添加图片描述

请添加图片描述

可以看到像素数据偏移是0x76,DIB长度是40。
二者之间的部分就是调色板。
一共是64字节,一共16个色。
比如调色板第一个色就是 蓝色0x24,绿色0x22,红色0x34.
在这里插入图片描述

调色板第二个色就是 蓝色0x9b,绿色0x80,红色0x7c.
在这里插入图片描述

调色板第三个色就是 蓝色0x9b,绿色0x80,红色0x7c.
在这里插入图片描述

像素数据

索引色

以调色板的4bit图像为例,
在这里插入图片描述
第一个4bit是0x2,索引调色板里的第三个颜色

可以看到图片的左下角开始,
依次像素值的索引号是 2 - 8 - 8 - 8 - 7 - 7 - 4 - 7 - 7 ……
对应颜色数值(BGR排列)是 2:(0x39, 0x4b, 0x99),8:(0x4c, 0x63, 0xac),7:(0x53, 0x73, 0xcd), 4(0x65,0x84,0xcb)
在这里插入图片描述

图片的左下角就是:
在这里插入图片描述

数据量也能对上,一共是512x512个像素,一个像素4bit,共占 512x512/2 = 131072 byes,从0x76~0x20075。
请添加图片描述
请添加图片描述

直接色

在16位 位深以上的bmp图中,没有调色板的存在,而是使用直接色进行数据记录。

请添加图片描述
可以看到,14字节的文件头 + 40字节的DIB头之后,就是图像的直接数据。
第一个像素是 B:0x37,G:0x51,R:0x9E,
第二个像素是 B:0x3e,G:0x51,R:0xa5
第三个像素是 B:0x3e,G:0x5a,R:0xa7

和左下角的颜色也是能对应上的

4. 遗留问题

使用图片浏览器 + powertoys的屏幕取色器,发现取出来的颜色数值都存在一定的偏差。
尝试了多个图片浏览器,vieas,画图,画图3D,photoshop……屏幕取色都是一样的,但是都和图片中记录的颜色数据有一定偏差的。
但是使用取色器去取(不管是photoshop还是画图软件内置的),可以取出文件中真实的数据。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9QaDOlM-1683326073171)(…/…/02__系统功能/04__附件仓库/01__Obsidian/Pasted%20image%2020230412112811.png)]

如图, 画图的取色器取到的153= 0x99, 75=0x4b, 57=0x39, 和powertoys的屏幕取色器取到的 0x994936 还是有一定的偏差的。
所以还是要使用图像软件中的取色器,而不是屏幕取色器。

5. 参考

  • BMP - 维基百科,自由的百科全书 (wikipedia.org) : 详细的协议和文件组成,足够了
  • 位图(bmp)文件格式分析_位图文件头_qingchuwudi的博客-CSDN博客
  • sketch颜色和html颜色不一致,photoshop和sketch中图片色彩不一致的原因和解决办法…_weixin_39867893的博客-CSDN博客

6. 系列文章

  • 【图像】图像格式(1):常见的图像格式协议对比
  • 【图像】图像格式(2) : 一张图理清所有的RAW RGB YUV图像格式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/495075.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

破事精英2◎爬向未来

胡强的2033未免有些过去可怕,海星果然又是反派。 只剩“脑子”的胡强 400百斤只剩“嘴”的庞小白 将自己身体分成一个个“方块”的苏克杰 苍蝇满天飞“衣服堆”的金若愚 “脑子”送到月球打两份工的沙乐乐 有机器人或者分身帮我们干活赚钱,我们去吃喝玩…

FM33A048B 红外调制

TZBRG寄存器保存一个 11 位的分频系数 X ,其值为 0~2047 之间的任一整数。 6 路 UART 共用一个红外调制频率发生器。 红外调制频率计算公式: FIR FAPBCLK/ (TZBRGTZBRG 1) 红外调制的方式为:发送数据0 时调制红外频率,发送数据 1…

JavaScript实现输入两个数比较两个数的大小,输出个人信息的两个程序代码

以下为实现输入两个数比较两个数的大小,输出个人信息的两个程序代码和运行截图 目录 前言 一、实现输入两个数比较两个数的大小 1.1 运行流程及思想 1.2 代码段 1.3 JavaScript语句代码 1.4 运行截图 二、输出个人信息 2.1 运行流程及思想 2.2 代码段 2.3…

Java每日一练(20230506) 全排列II、岛屿数量、有效数独

目录 1. 全排列 II 🌟🌟 2. 岛屿数量 🌟🌟 3. 有效的数独 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 …

atbf中imu数据读取逻辑分析仪抓取

一、说明 使用逻辑分析仪抓区imu的spi和中断io的信号,从而侧面描述atbf在imu上的数据读取方式; 二、硬件说明 1、硬件材料 1、mcu at32F437开发板 2、imu icm42688p 3、逻辑分析仪 梦源逻辑分析仪 4、调试器 jlink 2、原理图 3、实物图 4、固…

【git】git lfs

目录 原理 使用方法 报错记录 certificate signed by unknown authority 原理 项目中的大文件会很占空间。 git lfs(large file storage)将大文件替换为小指针, 当真正需要到这些大文件的时候, 才会从本地或者远端的lfs缓存中下载这些大文件. git lfs拥有本地lfs缓存和远端…

ubuntu系统版本查询命令方法

目录 一、使用命令:cat /proc/version 查看 二、 使用命令:uname -a 查看 三、 使用命令:lsb_release -a 查看 四、使用命令:hostnamectl 查看 五、使用命令:cat /etc/issue 查看 一、使用命令:cat /…

LeetCode:21. 合并两个有序链表

21. 合并两个有序链表 1)题目2)思路3)代码4)结果 1)题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2…

百度地图API介绍

4. 百度地图api 介绍 1. api开发文档 1.2 区别 JavaScript API v3.0 JavaScript API v3.0 链接 ,百度地图JavaScript API是一套由JavaScript语言编写的应用程序接口,可帮助您在网站中构建功能丰富、交互性强的地图应用,支持PC端和移动端基于浏览器的地图应用开发,且支持HT…

2023.03 青少年机器人技术等级考试理论综合试卷(三级)

2023 年 3 月青少年机器人技术等级考试理论综合试卷(三级) 一、单选题(共 20 题,共 80 分) 1. Arduino UNO/Nano 主控板,电位器连接到 A0 引脚,下图程序运行时,变量 potVal 值的范围是?&#xf…

【原创】DELL R750xs 无盘ESXi7安装

一、环境 一台磁盘阵列 多台DELL R750xs 充当esxi主机。 当前端口组 当前虚拟交换机 当前物理网卡 当前VMKernel网卡 当前ISCSI配置 二、问题 虚拟化环境重启时,ESXi主机比磁盘阵列先启动,启动后发现磁盘阵列处于脱机状态。 三、目标 让磁盘阵列启动…

SuperMap GIS基础产品云GIS FAQ集锦(2)

SuperMap GIS基础产品云GIS FAQ集锦(2) 【iManager】云套件ispeco-dashboard-api的日志等级只有到info,如何设置才能查看到debug级别的日志? 【解决方案】可以在ispeco-dashboard-api的deployment中添加以下环境变量,…

C++——类和对象(3)

作者:几冬雪来 时间:2023年5月6日 内容:C类和对象内容讲解 目录 前言: 1.运算符重载(续): 2.赋值重载: 结尾: 前言: 在上一篇博客中我们再一次讲解了…

【Python入门】Python的判断语句(布尔类型和比较运算符)

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

JavaScript:二叉树(层序遍历)

二叉树的层序遍历 层序遍历:逐层地,从左到右访问所有节点 广度优先 文章目录 二叉树的层序遍历102. 二叉树的层序遍历 - 力扣(LeetCode)107. 二叉树的层序遍历 II - 力扣(LeetCode)199. 二叉树的右视图 - 力…

Center-based 3D Object Detection and Tracking 论文学习

论文地址:Center-based 3D Object Detection and Tracking Github 地址:Center-based 3D Object Detection and Tracking 1. 解决了什么问题? 在点云中,3D 目标通常以 3D 框的形式表示。这个表征借鉴于 2D 图像的检测&#xff0…

nvm管理node版本与node对应的npm的版本

五一长假回来打开电脑发现自己的vscode不能成功运行项目,npm run dev之后没有任何反应,于是我想着使用cmd打开试试,结果cmd打开后画面只有一个横着的光标再闪,停几秒后就自动关闭了,看其他的博主写的解决方法一一试过了…

错排问题之年会抽奖与抄送列表

目录 一、编程题 1.年会抽奖 2.抄送列表 二、选择题 1.操作系统中关于竞争和死锁的关系下面描述正确的是? 2.并发是并行的不同表述,其原理相同。 3.在Unix系统中,处于()状态的进程最容易被执行。 4.当系统发生抖动(thrashi…

git版本升级后的问题

升级后的版本 git version 2.40.1.windows.1问题 RSA公钥和私钥是否有问题(本地和gitlab)[Git for Windows]的升级日志 Git for Windows 2.36.1 Git for Windows 2.33.0(2) 查看OpenSSH版本信息 OpenSSH v8.7p1 OpenSSH v8.8p1 解决方案 在本机~/.ss…

轨交展:人大金仓护航“中国式现代化的开路先锋”

2023北京-青岛国际城市轨道交通展览会 以“智赋城轨、绿色发展”为主题,2023北京-青岛国际城市轨道交通展览会暨高峰论坛于4月27日-29日在青岛举办,人大金仓携自主创新技术成果以及系列行业解决方案亮相,受到用户、伙伴的广泛关注和高度认可。…