C语言实现获取BMP文件信息

news/2024/9/28 1:19:32

通过命令行传递文件路径参数,输出BMP的width、height、size

1、从BMP的结构信息可知,文件大小、图片宽度、图片高度均占据4个字节,所以只需要打开文件读取对应位置的信息并打印即可。

2、为了提高可移植性,可以定义结构体,保持和BMP文件结构一致,这样可以一次性读取保存,方便后续调用。但是定义结构体时注意字节对齐,否则系统可能分配更多的空间,这样读取的信息会出现错误。

crazy3min_BMPfileFormat

实现代码

/***************************************************************************** * file name: 2024-05-11_GetBMPInfo.c* author   : crazy3min@outlook.com* date     : 2024-05-11* function : 获取BMP图片信息。* note     : 参考:https://learn.microsoft.com/en-us/previous-versions/ms969901(v=msdn.10)?redirectedfrom=MSDN* CopyRight (c)   2024   crazy3min@outlook.com   Right Reseverd* 
****************************************************************************/
#include <stdio.h>#pragma pack(1)  //将字节对齐改为1byte//定义BMP文件头结构体
struct BITMAPFILEHEADER 
{char bfType[2];      //一定是‘BM’int bfSize;          //文件大小short bfReserved1;   //保留short bfReserved2;   //保留int bfOffBits;       //指定从 BITMAPFILEHEADER 结构的开头到实际位的开头的偏移量
};//定义BMP信息头结构体
struct BITMAPINFOHEADER
{int biSize;             //应设置为 sizeof(BITMAPINFOHEADER)。该字段定义标题的大小(减去颜色表)。int biWidth;            //位图的宽度(以像素为单位)int biHeight;           //位图的高度(以像素为单位)short biPlanes;         //应始终为 1short biBitCount;       //DIB 的颜色分辨率(以每像素位数为单位)。该字段只有四个值有效:1、4、8 和 24。将来可能会添加新的分辨率(例如 16 位),但目前只有这四个值定义有效的 DIB。int biCompression;      //指定压缩类型。可以是以下三个值之一:BI_RGB、BI_RLE4 或 BI_RLE8。int biSizeImage;        //包含位图本身的大小(以字节为单位)或值 0。值 0 表示 DIB 具有默认大小。int biXPelsPerMeter;    //为所需的位图尺寸定义应用程序指定的值。此信息可用于在不同分辨率的设备上维护图像的物理尺寸。 GDI从不触及这些领域。不填时,均设置为0。int biYPelsPerMeter;    //为所需的位图尺寸定义应用程序指定的值。此信息可用于在不同分辨率的设备上维护图像的物理尺寸。 GDI从不触及这些领域。不填时,均设置为0。int biClrUsed;          //当该字段设置为 0 时,颜色表中的颜色数量基于 biBitCount 字段(1 表示 2 种颜色,4 表示 16 种,8 表示 256 种,24 表示无颜色表)。int biClrImportant;     //指定颜色表的前 x 颜色对 DIB 很重要。如果其余颜色不可用,图像仍然以可接受的方式保留其含义。 
};
#pragma pack()  //将字节对齐恢复默认int main(int argc, char const *argv[])
{//1.BMP图片的路径是通过命令行传递,所以需要检测参数有效性if ( 2 != argc ){printf("argument is invaild\n");return -1;}//2.利用标准IO库fopen()打开BMP文件FILE *BMP_file = fopen(argv[1], "rb");if ( NULL == BMP_file){printf("open %s is error\n",argv[1]);return -1;}//定义3个变量保存需要获取的信息int bfSize;int biWidth;int biHeight;//偏移2个字节,读取4个字节获得文件大小信息fseek(BMP_file, 2, SEEK_SET);fread(&bfSize, 4, 1, BMP_file);//偏移18字节,读取4个字节获得宽度信息fseek(BMP_file, 18, SEEK_SET);fread(&biWidth, 4, 1, BMP_file);//偏移22字节,读取4个字节获得宽度信息fseek(BMP_file, 22, SEEK_SET);fread(&biHeight, 4, 1, BMP_file);//输出信息printf("bmp name is %s, width = %d, height = %d, size = %d\n", argv[1], biWidth, biHeight, bfSize);//定义文件头、信息头变量struct BITMAPFILEHEADER BiFHead;struct BITMAPINFOHEADER BiInfoHead;//读取BMP信息直接写入结构体中fseek(BMP_file, 0, SEEK_SET);fread(&BiFHead, 14, 1, BMP_file);fread(&BiInfoHead, 40, 1, BMP_file);printf("bmp name is %s, width = %d, height = %d, size = %d\n", argv[1], BiInfoHead.biWidth, BiInfoHead.biHeight, BiFHead.bfSize);return 0;
}

参考

  1. DIBs and Their Use
  2. BMP file format

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

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

相关文章

系统IO常用函数接口

本文整理归纳了几种常用的系统IO的函数借口,以供读者查阅使用 目录系统IO与标准IO的区别打开文件:open关闭文件:close文件读取:read文件写入:write位置偏移:lseek 系统IO与标准IO的区别 1.标准IO可以看成是在系统IO的基础上封装了缓冲机制。 2.标准IO在内核中使用链表的管…

关于事件对象中的stopImmediatePropagation

关于e.stopPropagation(),大家应该知道这个方法是用来阻止事件冒泡的。 那么e.stopImmediatePropagation()可能比较少见。 stopImmediatePropagation 用来阻止在同一DOM对象上同一事件类型的其它事件函数的执行 并且与事件先后注册的顺序有关 document.addEventListener("…

【视频】R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险|数据分享|附代码数据

原文链接:http://tecdat.cn/?p=22410 最近我们被客户要求撰写关于逻辑回归的研究报告,包括一些图形和统计输出。 本文介绍了逻辑回归并在R语言中用逻辑回归(Logistic回归)模型分类预测病人冠心病风险数据 逻辑回归是机器学习借用的另一种统计分析方法。当我们的因变量是二…

数据分享|python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGBM交叉验证可视化

全文链接:https://tecdat.cn/?p=34434 原文出处:拓端数据部落公众号 分析师:Shilin Chen 离职率是企业保留人才能力的体现。分析预测职员是否有离职趋向有利于企业的人才管理,提升组织职员的心理健康,从而更有利于企业未来的发展。 解决方案 任务/目标 采用分类这一方法构…

MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类|附代码数据

原文链接:http://tecdat.cn/?p=26318 原文出处:拓端数据部落公众号最近我们被客户要求撰写关于长短期记忆 (LSTM) 神经网络的研究报告,包括一些图形和统计输出。 此示例说明如何使用长短期记忆 (LSTM) 网络对序列数据的每个时间步长进行分类。 要训​​练深度神经网络对序列…

14.GUI 编程

1.GUI 编程简介 GUI:图形用户界面 GUI 核心技术:Swing、Awt 类界面不美观 需要 jre 环境为什么要学习:可以写出一些小工具 工作时候,也可能需要维护到 Swing 界面,概率绩效 了解 MVC 架构,了解监听2.AWT 类 2.1.Awt 介绍 包含了很多类和接口 元素:窗口、按钮、文本框 ja…

项目冲刺——第五篇Scrum冲刺博客

作业所属课程 所属课程作业要求 作业要求作业目标 总结第四天的敏捷开发,安排好第五天敏捷开发冲刺一、站立式会议 1、会议图片2、昨天已完成的内容成员 任务肖杨、梁丽贤 完成贴子发布模块设计黄诃华、欧文杰 完成帖子发布接口姚佳如、李慧娣 复审整个系统的页面设计廖莹 协调…

前端使用 Konva 实现可视化设计器(10)- 对齐线

前端使用 Konva 实现可视化设计器,这次实现对齐线的交互功能,单个、多个、多选都可以对齐,同时还能磁贴。请大家动动小手,给我一个免费的 Star 吧~ 大家如果发现了 Bug,欢迎来提 Issue 哟~ github源码 gitee源码 示例地址不知不觉来到第 10 章了,感觉接近尾声了。。。 对…