Bitmap(BMP)图像信息分析主要说明带压缩的形式

文章目录

  • 参考资料
  • Bitmap图片结构
  • Bitmap图片组成
  • 实例说明

参考资料

  1. 微软官方-位图存储


Bitmap图片结构

序号名称说明
1Bitmap File HeaderBitmap文件头
2Bitmap Info HeaderBitmap信息头
3Color Palette Data调色板数据
4Bitmap Image Data图像数据

说明

  1. Bitmap文件头的大小为14字节
  2. Bitmap信息头的大小为40字节
  3. 调色板数据的大小为4的整数倍
  4. 可以没有没调色板





Bitmap图片组成

/* 位图文件头 */
typedef struct
{u16 FileType;       /* 文件类型标记 */u32 FileSize;       /* 文件大小 */u16 Reserve1;       /* 保留1 */u16 Reserve2;       /* 保留2 */u32 ImgDataOffset;  /* 图像数据偏移 */
}BitMapFileHeader_TypeDef, * pBitMapFileHeader_TypeDef;/* 位图信息头 */
typedef struct
{u32 InfoHeaderSize; /* 信息头大小 */u32 ImgWidth;       /* 图像宽度 */u32 ImgHeight;      /* 图像高度 */u16 ColorPlanes;    /* 颜色平面数 */u16 PixelsBits;     /* 像素位数 */u32 CompresType;    /* 压缩类型 */u32 ImgDataSize;    /* 图像数据大小 */u32 HorResolut;     /* 水平分辨率 */u32 VerResolut;     /* 垂直分辨率 */u32 ColorPalette;   /* 调色板大小 */u32 ColorImportant; /* 重要颜色数 */
}BitMapInfoHeader_TypeDef, * pBitMapInfoHeader_TypeDef;

在这里插入图片描述


序号地址范围名称大小(Byte)说明
10000~0001文件标识2文件类别标识符,Windows下为"BM"
20002~0005文件大小4整个文件的大小,单位字节
30006~0007保留12保留1,默认为0
40008~0009保留22保留2,默认为0
5000A~000D图像数据偏移地址4从文件开始到图像数据的偏移
6000E~0011信息头大小4位图信息头大小,Windows下为40
70012~0015图像宽度4图像宽度,单位像素
80016~0019图像高度4图像高度,单位像素
9001A~001B颜色平面数2目标设备的平面数,必须为1
10001C~001D像素位数2每像素的位数,必须为1、2、4、8、24、32
11001E~0021压缩类型4压缩类型,必须为0、1、2、3
120022~0025图像数据大小4整个图像数据大小,单位字节,必须为4的倍数
130026~0029水平分辨率4图像水平分辨率,单位像素/米
14002A~002D垂直分辨率4图像垂直分辨率,单位像素/米
15002E~0031调色板大小4色彩表中颜色的索引数,有压缩才有调色板
160032~0035重要颜色数4有压缩时与调色板大小相等,0表示都重要
170036~00xx调色板数据4 * N调色板规范,每项用四字节ARGB表示,Byte0蓝色,Byte1绿色分量,Byte2红色分量,Byte3填充符(设置为0)
1800mm~00nn图像数据N该区域大小取决于压缩方式,包含图像所有数据,颜色数量和调色板索引

  • 像素位数(PixelsBits)
PixelsBits = 1,  表示图像最多有两种颜色, 黑色和白色
PixelsBits = 4, 表示图像最多有16种颜色, 每个像素用4位表示
PixelsBits = 8, 表示图像最多有256种颜色,每个像素用8位表示
PixelsBits = 24,表示图像最多有16777216种颜色,每3个字节代表一个像素,颜色由RGB相对强度决定

  • 压缩类型(CompresType)
CompresType = 0 , 不压缩,BI_RGB
CompresType = 1 , BI_RLE4, RLE 8-bit / pixel
CompresType = 2 , BI_RLE8, RLE 4-bit / pixel
CompresType = 3 , BI_BITFIELDS, Bitfields 

  • 图像数据偏移地址(ImgDataOffset)的计算
//图像数据偏移地址 = 位图文件头 + 位图信息头 + (调色板大小 * 4)
ImgDataOffset = sizeof(BitMapFileHeader_TypeDef) + sizeof(BitMapInfoHeader_TypeDef) + (ColorPalette * 4)= 54 + (ColorPalette * 4)

  • 图像数据大小(ImgDataSize)的计算
//图像数据大小 = 文件大小 - 位图文件头 - 位图信息头 - (调色板大小 * 4)
ImgDataSize = FileSize - sizeof(BitMapFileHeader_TypeDef) - sizeof(BitMapInfoHeader_TypeDef) - (ColorPalette * 4)= FileSize - 54 - (ColorPalette * 4)

  • 图像数据(ImgData)

BI_RLE8编码 : 每个像素由8位RLE压缩编码,有编码方式绝对方式两种压缩


编码方式 : 由2字节组成,Byte0表示使用相同颜色的像素数目,Byte1表示调色板索引,其中Byte0=1~255
当Byte0=0Byte1=0行结束Byte1=1图像结束Byte1=2其后两字节表示下一个像素从当前位置水平和垂直的偏移量绝对方式 : Byte0=0,Byte1=3~255后面单个像素的数量,Byte2~Bytex单个像素的调色板索引

BI_RLE4编码 : 每个像素由4位RLE压缩编码,有编码方式绝对方式两种压缩


编码方式 : 由2个字节组成,第一个字节指定像素数目,第二个字节包含两种颜色索引,一个在高四位,另一个在低四位。
第1个像素使用高四位颜色索引,第2个像素使用低四位颜色索引,第3个像素使用高四位颜色索引,以此类推。绝对方式 : 第一个字节为0,第二个字节包含有颜色索引数,其后续字节包含颜色索引,颜色索引存放在该字节的高低4位中,一个颜色对应一个索引。第二个字节为0,行结束第二个字节为1,图像结束第二个字节为2,其后两个字节表示下一个像素从当前开始水平和垂直位置的偏移量。



说明

  1. 文件大小可能和右键属性显示的大小不一致需验证,以属性中大小为准
  2. 必须保证图像宽度、高度、调色板大小正确
  3. 图像数据大小可能出错



实例说明

00 00 1A BB 01 AD 13 09 00 05 70 BB BB BB 70 00 13 09 01 AD 1A BB 00 00//分离后实际效果
00 00 
1A BB 
01 AD 
13 09 
00 05 70 BB BB BB 70 00 
13 09 
01 AD 
1A BB 
00 00
数据说明
00 00行结束
1A BB使用相同颜色的像素数目为1A,调色板索引为BB
01 AD使用相同颜色的像素数目为01,调色板索引为13
13 09使用相同颜色的像素数目为13,调色板索引为09
00 05 70 BB BB BB 70 00单个像素的数量为05,其调色板索引分别为70 BB BB BB 70,00对齐使用

说明

  1. 图像宽度为: 1A + 01 + 13 + 05 + 13 + 01 + 1A = 97(像素)


00 00 28 BB 00 04 A6 A7 52 25 09 09 00 04 25 52 A7 A6 28 BB 00 00//分离后实际效果
00 00 
28 BB 
00 04 A6 A7 52 25 
09 09 
00 04 25 52 A7 A6 
28 BB 
00 00
数据说明
00 00行结束
28 BB使用相同颜色的像素数目为28,调色板索引为BB
00 04 A6 A7 52 25单个像素的数量为04,其调色板索引分别为04 A6 A7 52 25
09 09使用相同颜色的像素数目为09,调色板索引为09

说明

  1. 图像宽度为: 28 + 04 + 09 + 04 + 28 = 97(像素)

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

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

相关文章

二分和离散化

为什么把二分和离散化放一起:因为离散化其实是一种二分整数的过程。 二分 相信大家都接触过二分查找(折半查找),这就是二分的思想。 二分通过每次舍弃一半并不存在答案的区间,进而快速锁定要求的答案(二…

ESP-IDF学习记录(2)ESP-IDF 扩展的简单使用

傻瓜式记录一个示例的打开,编译,运行。后面我再一个个运行简单分析每个demo的内容。 1.打开示例代码 2.选择项目,文件夹 3.选择串口 4.选择调试方式 5.根据硬件GPIO口配置menuconfig 6.构建项目 7.烧录设备,选择串口UART方式 运行…

SpringMVC学习(一)——请求与响应处理

目录 一、SpringMVC简介 二、RequestMapping:请求路径映射 三、RestController 四、请求限定 五、请求处理 1.使用普通变量,收集请求参数 2.使用RequestParam明确指定获取参数 3.目标方法参数是一个pojo 4.RequestHeader:获取请求…

数据分析的分类和EDIT思维框架

为了服务于企业不同层次的决策,商业数据分析过程需要提供相应的数据科学产出物。 一般而言,数据分析需要经历从需求层、数据层、分析层到输出层四个阶段。 第一个阶段是需求层——确定目标,具体目标需要依据具体的层次进行分析&#xff1a…

实验五 时序逻辑电路部件实验

一、实验目的 熟悉常用的时序逻辑电路功能部件,掌握计数器、了解寄存器的功能。 二、实验所用器件和仪表 1、双 D触发器 74LS74 2片 2、74LS162 1片 3、74194 1片 4、LH-D4实验仪 1台 1.双…

iOS 中的 nil、Nil、NULL、NSNull 僵尸对象和野指针

iOS 中的 nil、Nil、NULL、NSNull 僵尸对象和野指针-CSDN博客 类型含义使用场景示例nil表示一个指向 Objective - C 对象的空指针。在 Objective - C 和 Swift(与 Objective - C 交互时)中用于表示对象不存在。当一个对象变量没有指向任何有效的对象实例…

JS面试题|[2024-12-28]

1.JS的设计原理是什么? JS引擎 运行上下文 调用栈 事件循环 回调 执行流程: JS引擎将代码解析为电脑可以执行的代码,调用一些API(运行上下文)让浏览器执行 JS是单线程的,每次从调用栈里面取出来的代码进行调…

全面了解 SQL Server:功能、优势与最佳实践

SQL Server 是微软公司推出的一款关系型数据库管理系统(RDBMS),广泛应用于企业级数据存储、数据分析、应用开发等领域。作为全球最受欢迎的数据库管理系统之一,SQL Server 提供了强大的功能和工具,支持从小型应用到大型…

jdk动态代理和cglib动态代理对比

jdk动态代理和cglib动态代理对比: CGLIB 和 JDK 动态代理都可以用来在运行时生成代理对象 1. 基本概念 JDK 动态代理:只代理接口(interface),无法代理类。它使用 java.lang.reflect.Proxy 类和 java.lang.reflect.I…

攻破 Kioptix Level 1 靶机

找教程然后自己练习,论菜狗的自我修养 基本步骤 1.确定目标IP 2.扫描端口,服务,版本信息,漏洞信息 3.查找漏洞可利用脚本 4.运行脚步 一、信息获取 arp-scan -l nmap -sS -p- -sV -sC -A --min-rate5000 192.168.5.130 二、查…

b站ip属地评论和主页不一样怎么回事

在浏览B站时,细心的用户可能会发现一个有趣的现象:某些用户的评论IP属地与主页显示的IP属地并不一致。这种差异引发了用户的好奇和猜测,究竟是什么原因导致了这种情况的发生呢?本文将对此进行深入解析,帮助大家揭开这一…

音视频入门基础:MPEG2-PS专题(2)——使用FFmpeg命令生成ps文件

通过FFmpeg命令可以将mp4文件转换为ps文件。由于ps文件对应的FFInputFormat结构为: const FFInputFormat ff_mpegps_demuxer {.p.name "mpeg",.p.long_name NULL_IF_CONFIG_SMALL("MPEG-PS (MPEG-2 Program Stream)"),.p.flags …

【数据结构与算法】单向链表

一、什么是链表 链表由一系列节点组成,每个节点都包含一个 data 域(存放数据)和一个 next 域(指向下一节点)。链表中的节点可以按照任意顺序存放在内存中,它们之间并不连续。每个节点都记录了下一个节点的地…

【计组】例题课后题

第一章 计算机如何区分指令和数据? 一般来讲,在取指周期中从内存读出的信息是指令流,它流向控制器;而执行周期中从内存读出的信息流是数据流,它由内存流向运算器。 从存放位置看,从代码段取出的是指令流,从数据…

一网多平面

“一网多平面”是一种网络架构概念,具体指的是在一张物理网络之上,逻辑划分出“1N”个平面。以下是对“一网多平面”的详细解释: 定义与构成 01一网多平面 指的是在统一的物理网络基础设施上,通过逻辑划分形成多个独立的网络平面…

跨语言数据格式标准化在 HarmonyOS 开发中的实践

文章目录 前言数据格式标准化的意义数据传递中的痛点标准化的优势 JSON 与 Protocol Buffers 的比较JSONProtocol Buffers HarmonyOS 跨语言数据传递示例示例代码:定义 Protocol Buffers 消息格式生成 Java 和 C 代码示例代码:Java 端序列化与传递数据C …

【Python】基于界面库PyQt5+Qt Dsigner的环境配置和界面绘制

目录 一 安装PyQt5以及PyQt5-tools 二 配置外部开发工具 三 使用Qt Designer设计界面 四 使用PyUIC将ui文件转换为py文件 五 CU分离实现逻辑代码 一 安装PyQt5以及PyQt5-tools 之前做的一些Python脚本、软件都是基于 Tkinter 实现的,其中界面的设计布局是很头疼…

Java读取InfluxDB数据库的方法

本文介绍基于Java语言,读取InfluxDB数据库的方法,包括读取InfluxDB的所有数据库,以及指定数据库中的measurement、field、tag等。 首先,创建一个Java项目,用于撰写代码。如果大家是基于IDEA来创建项目,则可…

嵌入式驱动开发详解7(并发、竞争、中断)

文章目录 前言并发和竞争原子操作自旋锁信号量互斥体 中断中断简介中断API上半部和下半部设备树分析中断号获取源码 后续参考文献 前言 中断会引起线程的切换,并发和竞争也是对线程切换的一种灵活保护和处理,因此这里将中断和并发与竞争放在一块讲解说明…

11.MySQL视图特性

目录 视图基本使用视图规则和限制 视图 视图是一个虚拟表, 其内容有查询定义. 同真实的表一样, 视图包含一系列带有名称的列和行数据. 视图的数据变化会影响到基表, 基表的数据变化也会影响到视图, 这个视图和刚刚讲的ReadView之间没有任何关系. 基本使用 创建视图: create vi…