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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FFmpeg是一个开源的音视频处理工具,可以用于转换、编辑、合并、剪辑等多种音视频操作。图片格式转换是FFmpeg的一个功能,它可以将图片从一种格式转换为另一种格式,例如从YUV420到RGB888。这个功能在处理视频时非常有用,当我们要播放一段视频时,有时会遇到视频原始数据的采样格式不被播放器支持的情况,这时就需要进行图片格式转换来适配播放器的要求。你可以通过使用FFmpeg提供的命令行参数来指定要转换的图片格式以及输出的文件名,如“-f image2 -i c:\temp\d.jpg -vcodec libx264 test.mp4”就是将一张jpg格式的图片转换为mp4格式的视频文件。需要注意的是,FFmpeg支持多种图片格式,包括jpg、bmp、tiff等等。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [winform C# ffmpeg 图片转成视频](https://download.csdn.net/download/wgfhill/85095473)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ffmpeg图片格式转换](https://blog.csdn.net/Ch0s1n_1/article/details/126678189)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值