BMP 图片也就是位图(bitmap),直接存储像素数据,几乎不进行压缩,图像信息丰富,比较明显的缺点就是占用空间大。
BMP 图片的结构很简单,首先是文件信息、接着是位图信息,然后是调色板信息,最后是位图数据。需要注意的是,文件头部信息的每一部分都是固定大小的,所以在处理文件头部信息时需要按 1 字节对齐的方式访问,或者在声明结构体时用关键字 “__attribute__((packed))” 取消字节对齐。

1. 文件信息

文件信息结构体:

typedef struct tag_bitmap_file_header{unsigned short         file_type;unsigned int      file_size;unsigned short        reserved1;unsigned short        reserved2;unsigned int      offset_bits;
} __attribute__((packed)) bitmap_file_header;

这个结构体的大小固定为 14 个字节。
file_type:文件标识,BMP 文件值固定为 0x4D42,存储为小端模式,转换成 ASCII 就是 “BM”。
file_size:整个文件的大小。
reserved1:保留。
reserved2:保留。
offset_bits:位图数据在文件中的偏移值,等于 “文件信息+位图信息+调色板信息”。

2. 位图信息

位图信息结构体:

typedef struct tag_bitmap_info_header {unsigned int      bitmap_info_size;int                bitmap_width;int                bitmap_height;unsigned short        planes;unsigned short       image_depth;unsigned int        compression;unsigned int        image_size;int              x_pels_permeter;int                 y_pels_permeter;unsigned int        color_used;unsigned int         color_important;
} __attribute__((packed)) bitmap_info_header;

这个机构体的大小固定为 40 个字节。
bitmap_info_size:位图信息的大小,固定为 40。
bitmap_width:位图宽度。
bitmap_height:位图高度,影响位图数据的存储方式。值为正数时,从位图数据的最后一行开始保存,也就是文件位图数据的第一行是图片数据的最后一行,这种存储方式支持压缩。值为负数时,文件位图数据的第一行就是图片数据的第一行。
planes:位图的位面数,固定为 1。
image_depth:位图的图像深度,表示位图数据中,几个二进制位表示一个像素点,如 8 bits 表示,8 个二进制位表示一个像素点。
compression:位图压缩方式。值为 BI_RGB 表示无压缩(没研究过压缩的)。
image_size:位图的数据大小。
x_pels_permeter:指定位图目标设备的水平打印分辨率,表示水平方向每米的像素点数量,可以是 0。
y_pels_permeter:指定位图目标设备的垂直打印分辨率,表示垂直方向每米的像素点数量,可以是 0。
color_used::位图实际使用调色板的颜色数量,图像深度少于或等于 8 bits 时,值有效。值为 0 表示使用了整个调色板的颜色。
color_important:重要的颜色数量,值通常等于 color_used,值为 0 时表示所有颜色都重要。

3. 调色板信息

调色板信息结构体:

typedef struct tag_bitmap_palette {unsigned char         blue;unsigned char      green;unsigned char         red;unsigned char       reserved;
} __attribute__((packed)) bitmap_palette;

这个机构体的大小固定为 4 个字节。
blue:蓝色。
green:绿色。
red:红色。
reserved:保留。
调色板数据是可选的,但是如果位图的图像深度少于或等于 8 bits 时,文件头部信息必须要带有调色板数据。

4. 位图数据

位图数据处理的时候注意图像深度和位图数据的存储方式。

BMP图片-文件头部信息相关推荐

  1. C实现几种对BMP图片文件的处理

    #C实现几种对BMP图片文件的处理 ##什么是BMP文件? BMP(全称Bitmap-File)是Windows操作系统中的一种标准的图像文件格式,能够被多种Windows应用程序所支持.随着Wind ...

  2. 通过c语言访问bmp图片文件修改图片信息

    在c语言中访问设定路径下的bmp图片文件,修改图片中像素RGB信息,从而达到修改图片中颜色的目的. 本程序实现的是将原图片中蜡笔小新的眼睛和嘴巴改了. #include <head.h> ...

  3. Unity 读取1-bit bmp图片文件

    由于unity本身不支持直接从文件中去读取bmp,如果不应用System.Drawing去读取bmp文件是分厂麻烦的事情.由于项目原因,不能引入这个dll,又要读取这样1-bit的黑白色的二维码图片, ...

  4. 让 Android 可以识别BMP图片文件,且目前Android所支持的所有图片格式

      在Android自带到图片浏览器中,默认是不支持BMP格式的图片文件到,通过修改源码使得它支持BMP文件. Android 的图片编码解码是由 Skia 图形库负责的,Skia 通过挂接第三方开源 ...

  5. python 获取指定文件夹里面的图片文件的信息

    import time import exifread import os #切换到图片文件夹,由于我的这个文件夹里全部是图片文件所以无需判断直接遍历 os.chdir('./news') aa=[] ...

  6. 图片文件Exif信息详细说明(转)

    当前,几乎新型的数码相机都使用Exif文件格式来存储图像. 它的规格是由 JEIDA 来制定的, 但是在互联网上还没有开放的文档可供浏览. 因此我根据从互联网上所能得到一些开放资料做成了这份Exif格 ...

  7. C语言实现生成BMP图片文件(BMP文件格式,二进制文件读写)

    Git地址: https://gitee.com/whik/bmp_gen_c_and_verilog/tree/master/c BMP文件格式详解参考: Verilog实现生成BMP文件(BMP文 ...

  8. 单片机读取SD卡中BMP图片文件并送往TFT彩屏上显示(测试成功)(二)

    二.软件部分 软件中INI_FLAG为设置的一个标志位,通过置1该位可以控制发送或接受数据速度.因为在初始化阶段SD卡操作需要适当放缓,而初始化成功后可以加快数据传动速率. 1>往SD卡写一个字 ...

  9. C++实现红外Fir谱图文件转BMP图片文件

    1.红外图谱文件 红外图谱文件由文件头和温度数据两部分组成,其中文件头 64 个字节,其余字节为温度数据. 如下如: 每个像素用两个字节表示温度(16 位有符号短整数),低字节在前,高字节在后,温度数 ...

  10. 基于ZYNQ的网页上传BMP图片至HDMI端口输出实例

    目录 Change Log 0 前言 0.1 系统实现 0.2 源码下载 0.3 项目信息 1 ZYNQ开发板HDMI输出BMP图片功能:FPGA相关 1.1 系统框图 1.2 RTL图 1.3 Bl ...

最新文章

  1. c语言如何给阻塞函数加超时,在代码中写一个延时而不阻塞的函数方法,给大家的参考 - 单片机 - 电子工程世界-论坛 - 手机版...
  2. cpuz北桥频率和内存频率_内存频率怎样计算,一分钟教会你
  3. linux基础知识——exec函数
  4. Arduino PID自整定库
  5. background部分总结
  6. idea设置炫酷主题
  7. hdu 5025 Saving Tang Monk 状态压缩dp+广搜
  8. jsp+ssm+mysql实现图书馆预约占座管理系统 代码+数据库脚本+论文+答辩稿+开题报告+任务书
  9. PHP中fileinfo的作用以及怎么开启fileinfo
  10. 只会用ping测试网络通不通?高级网工还会这么用
  11. 卸载Win10右下角资讯和兴趣(天气)
  12. Python之freshman05
  13. python常用的案例
  14. Linux 固件子系统----如何更新固件
  15. (论文分析)基于契约理论和贝叶斯匹配博弈的分层多址边缘计算卸载
  16. 如何关闭office软件中字符的下划线和波浪线
  17. 基于单片机的光控路灯设计含程序和仿真图
  18. ps把照片背景变成透明[原为白色或其他颜色]
  19. GitLab分支合并
  20. MICROSOFT TEAMS MACOS版本本地权限提升漏洞

热门文章

  1. java 暴露接口_Java基于spring暴露接口供外部调用
  2. 运营简史:互联网运营的20年发展与演变
  3. iOS中调用短信和邮箱的方法
  4. sort排序不区分大小写C语言,使用sort进行不区分大小写的排序(list,key = str.lower)...
  5. 菜鸟腾飞安全网之精通vmware虚拟机系列教程(12课全)听课笔记
  6. PyQt6 使用 QAxWidget 打开 IE/Word
  7. 少儿编程微课程14:对称图形的模拟验证
  8. html修改progress背景色,html_progress元素以及样式修改
  9. Entrepreneur\'s Credo of the American 美国的企业家宣言
  10. 北京电影学院及中央戏剧学院老师推荐的必看影片,我真是一条一条翻的,一条一条写的,是真的。...