当前位置: 首页 > article >正文

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=0
    Byte1=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.kler.cn/a/456713.html

相关文章:

  • SpringBoot数据字典字段自动生成对应code和desc
  • STM32完全学习——FATFS0.15移植SD卡
  • 【Linux命令】su、sudo、sudo su、sudo -i、sudo -l的用法和区别
  • CentOS7下的 OpenSSH 服务器和客户端
  • 基于 `android.accessibilityservice` 的 Android 无障碍服务深度解析
  • 玉米中的元基因调控网络突出了功能上相关的调控相互作用。\zm.rn20b样本为例
  • 浏览器http缓存问题
  • 5个实用的设计相关的AI网站
  • NLP 中文拼写检测纠正论文-02-2019-SOTA FASPell Chinese Spell Checke github 源码介绍
  • 2024.12.27 周五
  • STM32-笔记13-红外避障模块-LCD1602模块
  • 基于单片机的抽油烟机自动控制无级调速电路设计
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之2
  • QML 之过渡
  • MySQL Workbench菜单汉化为中文
  • WPF使用资源定义和样式资源,解耦视图与逻辑(较多样式重复的时候使用)
  • 有没有免费提取音频的软件?音频编辑软件介绍!
  • 【深度学习基础之多尺度特征提取】特征金字塔(Feature Pyramid)是如何在深度学习网络中提取多尺度特征的?附代码
  • curl -fsSL https://get.docker.com|sh 解释命令
  • Pytorch | 利用GRA针对CIFAR10上的ResNet分类器进行对抗攻击
  • doris集群存储目录切换
  • Function.prototype和Object.prototype 的区别
  • 【自动驾驶】3 激光雷达③
  • webflux版定时任务实现方案
  • LeetCode 242. 有效的字母异位词 (C++实现)
  • 超短波自组网如何守护森防安全?