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

这篇具有很好参考价值的文章主要介绍了bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录
一、概述
二、.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查看其属性如下:
bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等
bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等

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;
  • 结构体字段详细说明:
    bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等
  • 位图文件举例
    bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等
    上图是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;
  • 结构体字段详细说明:
    bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等
  • 位图文件举例
    bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等
    第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数值 - 位图文件头大小 - 位图信息头大小;
  • 位图文件举例
    bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等
    上图红色框内的数据是4bit位图的调色板,总共有16个颜色:0x00000000、0x00111111、0x00222222、0x00333333、0x00444444、0x00555555、0x00666666、0x00777777、0x00888888、0x00999999、0x00aaaaaa、0x00bbbbbb、0x00cccccc、0x00dddddd、0x00eeeeee、0x00ffffff;数据大小等于0x76-54个字节。下面看一下1bit的位图数据:
    bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等
    上图红色框内的数据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字节。
bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等

三、位图的其他知识

3.1 压缩的位图

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

3.1.1 游程编码

游程编码,也叫行程编码,英文名称是:Run Length Encoding,简称RLE
其编码原理是:将数据中连续出现n次的数据a,使用na来表示。

举例:
如果有下面一段数据,由5个1,4个2,7个3组成,1111122223333333
使用游程编码表示为514273,51表示5个1,42表示4个2,73表示7个3
这样就把16个数字压缩成6个数字了。

3.1.2 位图游程编码

位图游程编码主要有两种:针对4bit位图的BI_REL4,针对8bit位图的BI_REL8

位图游程编码的编码方式:
1、每两个字节组成一个信息单元;
2、如果第一个字节大于0,则表示相连的像素的个数;第二个字节表示这些像素的值(调色板的索引)。
3、如果第二个字节等于0,则第二个字节可能有三种取值:0、1、2
 3.1、第二个字节值为0,表示行结束
 3.2、第二个字节值为1,表示位图结束
 3.3、第二个字节值为2,表示像素位置增量,之后的一个信息单元(2字节)指明了下个像素相对于当前像素的增量。

举例:下图是100x100的BI_REL4压缩的4bit位图数据,图中红色框的两个0x64表示宽高都为100,第0x1e位的4个字节为0x2,表示压缩方式为BI_REL4
从0x76(图中蓝色框)开始是位图数据,第一个字节是0,第二个字节是2,表示位置增量;第三个字节为a(十进制为 10),表示下个像素是在当前像素的10个像素之后;第四个字节0没有任意含义,可能是为了对齐。
从0x7a(图中紫色框)开始的0x0aff是一个信息单元,第一个字节表示0x0a(十进制为 10)的连续的像素,第二个字节表示这10个像素的值都为f
接下去的一个信息单元0xa0
bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等


参考:
https://share.blog.csdn.net/article/details/1414661文章来源地址https://www.toymoban.com/news/detail-416881.html

到了这里,关于bmp位图格式详细介绍-1/4/8/16/24/32bit、存储格式等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32读取24位模数转换(24bit ADC)芯片HX711数据

    HX711是一款国产低成本24位ADC芯片,常用于与称重传感器配合实现体重计的应用。这里介绍STM32读取HX711的电路和代码实现。 HX711的内部原理如下图所示: 市面上有普通和带屏蔽的两种模块: STM32可直接与HX711进行连接,选择2个具有FT(5V耐压)的管脚,将其中对应时钟输出的管

    2023年04月08日
    浏览(50)
  • STM32配置读取双路24位模数转换(24bit ADC)芯片CS1238数据

    CS1238是一款国产双路24位ADC芯片,与CS1238对应的单路24位ADC芯片是CS1237,功能上相当于HX711和TM7711的组合。其功能如下所示: 市面上的模块: CS1238内部原理如下所示, VDD是DVDD和AVDD的合并: 有单独的参考电压输入设置管脚,以及内部输出与VDD同电压的参考输出电压,可选连接到

    2024年02月16日
    浏览(36)
  • STM32 MCO+SPI获取24位模数转换(24bit ADC)高速芯片ADS1271采样数据

    STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要连接外部ADC实现。ADS1271是 TI公司一款高速24位Σ-Δ型模数转换器(ADC) ,数据率达到105K SPS, 即一秒可以采样105000次。 这里介绍基于ADS1271的24位ADC采样实现。采用STM32CUBEIDE开发工具,以S

    2024年02月16日
    浏览(32)
  • STM32模拟SPI协议获取24位模数转换(24bit ADC)芯片AD7791电压采样数据

    STM32大部分芯片只有12位的ADC采样性能,如果要实现更高精度的模数转换如24位ADC采样,则需要连接外部ADC实现。AD7791是亚德诺(ADI)半导体一款用于低功耗、24位Σ-Δ型模数转换器(ADC) ,适合低频测量应用,提供50 Hz/60 Hz同步抑制。 这里介绍基于AD7791的24位ADC采样实现。 AD7791的管脚

    2024年02月09日
    浏览(49)
  • STM32模拟SPI时序配置读取双路24位模数转换(24bit ADC)芯片ADS1220采样数据

    TI公司的双路24位模数转换芯片ADS1220具有比较丰富的模式配置,双路差分输入采样也可以配置为4路单端输入信号采样。有多种参考电压源可选,内部增益(从1倍到128倍)和输出率(可达到2K/s)可配置,模拟电压和数字电路电压可单独设置等等。这里介绍STM32访问和读取ADS12

    2023年04月09日
    浏览(61)
  • STM32为基础的模拟I2C通用8bit和16bit读取以及多字节读取

    GPIO模拟I2C驱动的通用代码,I2C的寄存器地址有8位和16位的,主要解决了同一个MCU同时处理8位和16位寄存器地址芯片时候的驱动问题。 以上是结构体,作为参数,其中DevAddr是芯片地址,RegAddr是寄存器地址,data_len是写入或者读取的数据长度,data_buf是写入或者读出的数据缓冲

    2024年04月28日
    浏览(33)
  • STM32模拟SPI时序控制双路16位数模转换(16bit DAC)芯片DAC8552电压输出

    STM32部分芯片具有12位DAC输出能力,要实现16位及以上DAC输出需要外挂DAC转换ASIC。 DAC8552是双路16位DAC输出芯片,通过SPI三线总线进行配置控制输出。这里介绍通过GPIO管脚模拟时序进行控制的方式。 DAC8552支持2.7V~5.5V的供电,根据需要提供电源电压,对于STM32可能面对不同供电电

    2023年04月09日
    浏览(34)
  • IP地址加/8(16、24、32)的意义

    先了解一下IP的分类 网络号:用于识别主机所在的网络;  主机号:用于识别该网络中的主机。 其中A类分配给政府机关使用,B类地址给大中型企业使用,C类地址给个人使用。这三种是主要的。 IP地址分为五类,A类保留给政府机构,B类分配给中等规模的公司,C类分配给任何

    2024年02月14日
    浏览(30)
  • 在IP地址后面加个 /8(/16/24/32)代表什么意思

    本文章向大家介绍ip地址后边加个/8(16,24,32)是什么意思?,主要包括ip地址后边加个/8(16,24,32)是什么意思?使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。 斜杠后面的数字N,表示IP地址前N位是网络位。是不是感觉很奇怪

    2023年04月23日
    浏览(72)
  • bmp图像文件格式超详解

    BMP(Bitmap-File)图形文件,又叫位图文件,是Windows采用的图形文件格式,在Windows环境下运行的所有图像处理软件都支持BMP图像文件格式。Windows系统内部各图像绘制操作都是以BMP为基础的。一个BMP文件由四部分组成: BMP文件的数据按照从文件头开始的先后顺序分为四个部分: 文

    2024年01月23日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包