bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等

news2024/11/18 17:36:26

目录
一、概述
二、.bmp格式文件详解
 2.1 位图文件头
 2.2 位图信息头
 2.3 调色板
 2.4 位图数据
三、位图的其他知识
 3.1 压缩的位图


一、概述

bmp是英文Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,随着windows的流行,bmp位图格式被广泛应用。

位图按照是否与设备相关分类可以分为:设备相关位图DDB(device-dependent bitmap)、设备无关位图DIB(device-independent bitmap)。

按照像素深度分类可以分为:1bit位图(2色)、4bit位图(16色)、8bit位图(256色)、16bit位图(65536色-高彩色)、24bit位图(1670万色-真彩色)、32bit位图(1670万色-增强型真彩色)。

二、.bmp格式文件详解

.bmp位图文件由四个部分组成:

  • 位图文件头(bitmap-file header)
  • 位图信息头(bitmap-information header)
  • 调色板(color table)
  • 位图数据(图像数据,Data Bits 或Data Body)阵列

下面对文件结构的这几个部分进行详细的介绍。
本节举例说明的位图是100*100的4bit位图,在windows查看其属性
如下:
在这里插入图片描述
在这里插入图片描述

2.1 位图文件头

Windows BMP位图文件头共14个字节,包含了文件类型标志、文件大小等信息,定义的结构体也比较,详细说明如下:

  • 结构体:
typedef struct BITMAPFILEHEADER /* size: 40 */
{
   unsigned short bfType;	// 文件的类型,该值必需是0x4D42,也就是字符'BM'。
   unsigned long  bfSize;	// 位图文件的大小,用字节为单位
   unsigned short bfReserved1;// 保留,必须设置为0
   unsigned short bfReserved2;// 保留,必须设置为0
   unsigned long  bfOffBits;// 位图数据距离文件开头偏移量,用字节为单位
} BITMAPFILEHEADER;
  • 结构体字段详细说明:
    在这里插入图片描述
  • 位图文件举例
    在这里插入图片描述
    上图是100*100的4bit位图文件使用十六进制查看的截图。结合前面的结构体说明,
    第0-1的2个字节是0x4d42(红色框),表示这是.bmp文件;
    第2-5的4个字节数值为0x14c8(绿色框),换算十进制为5320,说明图片大小为5320字节,与前面的位图属性大小对应上;
    第6-9的4个字节都是保留的,且必须填0;
    第a-d的4个字节数值为0x76,换算十进制为118,说明位图数据距离文件起始位置118个字节,其实就是位图文件头(14字节)、位图信息头(40字节)、调色板(16色*4=64字节)三个部分占用的字节数。

2.2 位图信息头

Windows BMP位图信息头共40个字节,包含了文件类型标志、文件大小等信息,定义的结构体也比较,详细说明如下:

  • 结构体
typedef struct WINBMPINFOHEADER  /* size: 40 */
{
   unsigned long  biSize;		// BITMAPINFOHEADER结构所需要的字数
   unsigned long  biWidth;		// 图像宽度,单位为像素
   unsigned long  biHeight;		// 图像高度,单位为像素,负数,则说明图像是正向的
   unsigned short biPlanes;		// 为目标设备说明位面数,其值将总是被设为1
   unsigned short biBitCount;	// 一个像素占用的bit位,值位1、4、8、16、24、32
   unsigned long  biCompression;// 压缩类型
   unsigned long  biSizeImage;	// 位图数据的大小,以字节为单位
   unsigned long  biXPelsPerMeter;// 水平分辨率,单位 像素/米
   unsigned long  biYPelsPerMeter;// 垂直分辨率,单位 像素/米
   unsigned long  biClrUsed;	// 
   unsigned long  biClrImportant;// 
} WINBMPINFOHEADER;
  • 结构体字段详细说明:
    在这里插入图片描述
  • 位图文件举例
    在这里插入图片描述
    第0xe-0x11的4个字节(红色框):数值为0x28,十进制为40,表示位图信息头为40字节;
    第0x12-0x15的4个字节和0x16-0x19的四个字节(橙色框):数值为0x64,十进制为100,表示宽高为100像素,与前面的位图属性宽度、高度对应;
    第0x1a-0x1b的2个字节(紫色框):数值为1
    第0x1c-0x1d的2个字节(紫色框):数值为4,表示每个像素4bit,与前面的位图属性位深度对应;
    第0x1e-0x21的4个字节(浅蓝色框):数值位0,表示不压缩;
    第0x22-0x25的4个字节(绿色框):数值为0x1452,十进制为5202,表示位图数据的大小为5202字节,加上前面位图文件头位图信息头调色板的118字节,刚好等于文件大小5320字节;
    第0x26-0x29的4个字节和0x2a-0x2d的4个字节(蓝色框):数值0x0b12,十进制数2834
    第0x2e-0x31的4个字节和0x32-0x35的4个字节(灰色框):数值0

2.3 调色板

调色板是为了让一些颜色深度比较小(1bit、4bit、8bit)的位图可以表示颜色而设置的。调色板存储颜色,后面的位图数据存储颜色索引,这样调色板+位图数据就可以表示颜色了。需要注意的是,16bit24bit32bit的位图一般没有调色板,因为从16bit开始就直接使用位图数据表示颜色了。

调色板可以理解为一个颜色数组,数组的每个元素就是一个4字节的argb值,数组大小由位图的颜色深度决定:1bit位图的调色板有2个颜色(2x4=8字节)、4bit位图的调色板有16个颜色(16x4=64字节)、8bit位图的调色板有256个颜色(256x4=1024字节),整个调色板大小就是对应的颜色个数乘以4。

调色板数据大小 = 位图文件头的bfOffBits数值 - 位图文件头大小 - 位图信息头大小;
  • 位图文件举例
    在这里插入图片描述
    上图红色框内的数据是4bit位图的调色板,总共有16个颜色:0x00000000、0x00111111、0x00222222、0x00333333、0x00444444、0x00555555、0x00666666、0x00777777、0x00888888、0x00999999、0x00aaaaaa、0x00bbbbbb、0x00cccccc、0x00dddddd、0x00eeeeee、0x00ffffff;数据大小等于0x76-54个字节。下面看一下1bit的位图数据:
    在这里插入图片描述
    上图红色框内的数据1bit的调色板,总共有2个颜色:0x00ffffff、0x00000000,数据大小等于0x3e-54个字节。

2.4 位图数据

位图数据分两种情况,如果带调色板,则位图数据存放的是调色板的颜色索引,如果不带调色板,则位图数据存放实际的argb值。另外,由于Windows默认的扫描的最小单位是4字节,BMP图像顺应了这个要求,要求每行的数据的长度必须是4的倍数,如果不够需要进行比特填充,填充的值有可能是乱码。

4对齐的计算,以上面的位图文件举例:
①每个像素4bit,每行100个像素(宽为100),也就是每行400bit,等于50个字节,要求每行是4的倍数,所以每行需要补2个字节才是4的倍数,也就是每行52个字节;
②总共100行(高为100),所以位图数据就是52x100=5200字节;
③再加上前面三部分是118字节,总共是5318字节,由于5318不是4对齐的数,又要补2个字节使之4对齐,所以这个文件就是5320字节。

下图是4bit带调色板位图数据,每4个bit表示一个颜色索引,这里每4bit的值都是f,表示用调色板的第15个颜色来填充每个像素。另外,可以看到最下面一行有两个字节数值是0x22,这就是4对齐补充的第51、52字节。
在这里插入图片描述

三、位图的其他知识

3.1 压缩的位图

压缩的位图是指位图数据进行过压缩的位图,其压缩类型存储在位图信息头biCompression字段,下面简单介绍一下是怎样压缩位图数据的。
BI_RGB:不压缩
BI_REL8:采用8比特游程编码压缩位图数据
BI_REL4:采用4比特游程编码压缩位图数据

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

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

相关文章

FFplay音频滤镜分析

音频流的 滤镜是通过 configure_audio_filters() 函数来创建的,因为 ffplay 为了代码的通用性,即便命令行参数不使用滤镜,AVFrame 也会过一遍 空滤镜做下样子。 configure_audio_filters() 函数的流程图如下: configure_audio_fi…

HCIA OSI参考模型

一、前言 OSI七层模型是我们耳熟能详的,其实没有太多可以说的地方,我这里就按自己的理解做一下汇总。 二、OSI 七层模型 OSI七层模型是由“国际标准化组织”制定的“参考”模型。 1、物理层 实际上就是对网线、光纤等“连接”介质进行规定&#xff…

初学者必看的3D建模避坑技巧,高效3D制作

近来,随着3D技术的进步被认为任何对 3D 建模主题感兴趣的人打开了机会之门。现在,只要您拥有一台计算机和良好的空间分析技能,您就可以通过时间和持续练习来完善您的 3D 雕刻方式。 也就是说,该领域的许多初学者往往会犯建模错误&…

信号傅里叶变换后频谱刻度设置问题-附Matlab代码

一、概述 时域信号经FFT变换后得到了频谱,在绘制频谱图时还必须设置正确的频率刻度,这样才能从图中得到正确的结果。 二、实例分析 有一余弦信号,信号频率为30Hz,采样频率128Hz,信号长128,原始信号如下图…

【JavaScript+自然语言处理+HTML+CSS】实现Web端的智能聊天问答客服实战(附源码 超详细必看)

需要源码请点赞关注收藏后评论区留言私信~~~ 智能客服的部署方式比较多样化,可以作为组件嵌入到其他应用程序,也可以部署到定制网站,下面分别介绍如何新创建智能客服应用,从而使其能够集成为网站功能的一部分,以及如何…

给你讲明白MySQL的乐观锁和悲观锁

乐观锁与悲观锁是一种广义上的概念。不管是 Java 语言,也或者是其他语言以及数据库都有这类概念对应的实际应用。想要学习乐观锁和悲观锁就要学习他们的基本知识,那么下面我们来学习一下。 锁 生活中:锁在我们身边无处不在,比如我…

PMO项目经理必备的简洁解决问题方案和报告模板

项目经理虽然有责无权,他的权力更多来源于汇报的权力和影响力,作为项目经理和PMO难免经常会进行报告或者是提供方案建议,能够最短时间的讲明白问题和建议才会更多的获得机会,那么如何才能简明扼要的把你的方案和报告说清楚呢&…

基于jsp+mysql+ssm基金信息管理系统-计算机毕业设计

项目介绍 本基金信息管理系统主要包括系统基金信息管理模块、用户管理模块、基金收藏管理、登录模块、和退出模块等多个模块,系统采用了jsp的mvc框架,SSM(springMvcspringMybatis)框架进行开发,本系统是独立的运行,不依附于其他系统,可移植,…

图扑软件数字孪生污水处理厂

随着人工智能、大数据、云计算、物联网和5G等新技术不断融入水务行业的各个环节,智慧水务已逐渐成为传统水务领域转型升级的重要方向。 图扑软件依托自主研发的 HT for Web 产品,并结合视频融合、BIM、5G、物联网、云计算及大数据等先进技术,…

IIS反向代理 设置IIS跨域访问

概念说明 浏览器的同源策略限制了对某些资源的跨域访问,其目的是保障用户数据安全,但同时也阻止了部分合理的跨域请求。为了绕过同源策略的限制,人们提出了多种跨域访问方案。 解决步骤 打开IIS,选中当前站点 -》右侧找到HTTP响…

手写js-防抖,节流

防抖 debounce 函数所做的事情就是,在用户停止某个操作一段时间之后才执行相应的监听函数,而不是在用户操作的过程当中,浏览器触发多少次事件,就执行多少次监听函数。 以最后一次操作为准开始计时器 应用场景: 登录、发短信等按钮…

JAVA SCRIPT设计模式--结构型--设计模式之Bridge桥接模式(7)

JAVA SCRIPT设计模式是本人根据GOF的设计模式写的博客记录。使用JAVA SCRIPT语言来实现主体功能,所以不可能像C,JAVA等面向对象语言一样严谨,大部分程序都附上了JAVA SCRIPT代码,代码只是实现了设计模式的主体功能,不代…

Linux 之七 内核架构、API/ABI 介绍、文件层次结构、Kernel 源码文件

Linux 内核最早是在 1991 年由芬兰大学生林纳斯托瓦兹为自己的个人电脑开发的,并在 GNU 通用公共许可证第 2 版(也包含了其他兼容许可证)之下发布的一种开源的类 Unix 操作系统宏内核。 注意,我们通常说的 Linux 系统是 Linux Ker…

FineReport数据图表制作教程-密码控件

1. 概述 1.1 版本 报表服务器版本 功能变更 11.0 -- 1.2 应用场景 1.2.1 填报控件 填报报表中可以通过该控件输入密码信息,录入密码,如下图所示: 1.2.2 参数控件 参数面板处可以通过该控件输入密码信息,键入查询参数&#…

WebRTC GCC 拥塞控制算法(TFB-GCC)

目录 一. 前言 二. TFB-GCC原理 1. 接收端记录并反馈收包情况 (1)transport-wide sequence nunmber (2)RTCP RTPFB TW 报文 2. 发送端结合包接收反馈情况进行带宽预估拥塞控制 (1)基于延时梯度的带宽…

新手必看!jenkins邮件发送配置,一教就会!

最近刚学习jenkins,在配置邮件发送的时候,踩了很多坑,各种百度查询,调试了大半天,终于成功解决 !特此记录! 遇到最让我头痛的问题,就是明明控制台显示邮件发送成功,但是…

【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用的解决方案)

【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用的解决方案) 理论转载: leung-manwah.blog.csdn.net/article/details/114675725 一、低功耗模式简介 系统提供了多个低功耗模式,可在 CPU 不需要运行时(例如等待外…

Python实现PSO粒子群优化循环神经网络LSTM分类模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一…

配置别名 配置alias

Linux: ~/.bashrc MAC bash 的配置文件是 ~/.bash_profile zsh的配置文件是~/.zsh 查看一下你的shell类型 terminal->performance->shells open with 方案是 1. 创建新的文件存放alias cd ~ vi .myalias edit .myalias esc :wq保存 2. add config to ~/.zshrc …

Java数据结构与Java算法学习Day09---并查集(简略笔记记录)

目录 并查集的功能: 1.1并查集结构 136 1.2并查集API设计 137 1.3并查集代码的实现 137 1.3.1UF(int N)构造方法实现 1.3.2并查集代码测试 138 1.4并查集应用案例 139 1.5UF_Tree算法优化 139 1.5.1UF_tree API设计 1.5.2优化后的…