[音视频] BMP 图片格式分析 您所在的位置:网站首页 png无损转换pdf [音视频] BMP 图片格式分析

[音视频] BMP 图片格式分析

2023-03-03 03:22| 来源: 网络整理| 查看: 265

BMP 格式是什么

BMP(Bitmap)是一种常见的无损位图图像文件格式,是Windows操作系统中最早使用的图像格式之一,也是目前很多应用程序所使用的标准图像格式之一。 整体结构图,如下图所示 在这里插入图片描述

格式

在这里插入图片描述

BMP文件格式有多个版本,本文只介绍最基本的结构,从上图可以看到 Bitmap file header, DIB header 和 Pixel array 是必选的。

Bitmap file header

该结构主要用于识别文件和判断文件是否损坏。以 小端 的方式存储。 在这里插入图片描述

typedef struct tagBITMAPFILEHEADER { WORD bfType; //图片种类,BMP图片固定为BM,表示为十六进制就是0x4d42 DWORD bfSize; //该图片文件的大小 WORD bfReserved1; //保留字,不用管 WORD bfReserved2;//保留字,不用管 DWORD bfOffBits; //实际图片数据的偏移量,即`DIB`的偏移量,也即前三个结构体的大小 } BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;

该结构体中,我们需要在意的只有两个属性:bfSize与bfOffBits,分别等于该图片文件的大小,以及DIB数据区前三个结构体的大小

示例分析

本文使用上图作为分析对象,大小为 100*100,存储 rgb 数据。黑色对应的 rgb 为(0,0,0),另一个橙色对应 rgb 为(255, 127, 39)

在这里插入图片描述 前面两个字节分别是 “BM" 接着是文件的大小 0x00007566(30054 = 100 * 100 * 3 + 14 + 40) 接着是4个字节的保留数据 0x00000000 最后是4个字节的 DIB 的偏移量 0x00000036 (54)

DIB header

DIB header 有多种变种,其他变种可以参考 wiki,本文只介绍最基本的结构体。

typedef struct tagBITMAPINFOHEADER{ DWORD biSize; //指定此结构体的长度 LONG biWidth; //bmp图片的宽度 LONG biHeight; //bmp图片的高度 WORD biPlanes; //平面数,显示器只有一个平面,所以一般为1 WORD biBitCount; //颜色位数,目前一般用24位或32位 DWORD biCompression; //压缩方式,可以是0,1,2,0表示不压缩,BMP为不压缩,所以为0 DWORD biSizeImage; //实际位图数据占用的字节数.由于上面不压缩,所以这里填0即可 LONG biXPelsPerMeter; //X方向分辨率,即每米有多少个像素,可以省略 LONG biYPelsPerMeter; //Y方向分辨率,即每米有多少个像素,可以省略 DWORD biClrUsed; //使用的颜色数,如果为0,则表示默认值(2^颜色位数) DWORD biClrImportant; //重要颜色数,如果为0,则表示所有颜色都是重要的 } BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;

这个结构体的信息量非常多,但需要我们填的其实并不多: biSize:指定此结构体的长度,一般都直接为: sizeof(BITMAPINFOHEADER)即可 biWidth:图片宽度,需要自己根据需要填 biHeight:图片高度,需要自己根据需要填 biPlanes:平面数,填1即可 biBitCount:位数,本文采用的是24位图,所以填24 除了以上几个需要填的,其它都直接清零即可

示例分析

在这里插入图片描述 biSize 为 0x00000028(40) width 为 0x00000064(100) height 为 0x00000064(100) biPlanes 为 0x0001 biBitCount 为 0x0018(24) biCompression 为 0x00000000 biSizeImage 为 0x00007530(30000) 剩下的都为 0

pixel array

以 packed 的方式保存数据,每行数据以 4 字节对齐。 在这里插入图片描述 中间公式中括号(上面有横线)的意思应该是向上取整,后面括号是向下取整(下面有横向) 在这里插入图片描述 因为 ImageHeight 可能为负数,所以需要加绝对值。height 为整数,默认先存储左下角数据,负数,默认先存左上角数据。 保存数据,以保存 rgb 颜色为例,其从左下角开始保存数据,从左到右,从下到上。由于是小端,所以按照 B G R 的形式保存数据。

示例分析

左下角 bgr(0x27,0x7f, 0fff) 在这里插入图片描述

其他 代码保存 BMP 图片 bmp 可以保存 10bit 数据吗 透明分量怎么保存 参考文献

https://blog.csdn.net/weixin_50964512/article/details/128646165?ops_request_misc=&request_id=&biz_id=102&utm_term=bmp&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-0-128646165.nonecase&spm=1018.2226.3001.4187 https://en.wikipedia.org/wiki/BMP_file_format



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有