首页 > 其他分享 >C语言实现获取BMP文件信息

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

时间:2024-05-11 23:19:05浏览次数:23  
标签:字节 int 信息 C语言 获取 BMP file 定义

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

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

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

crazy3min_BMPfileFormat

实现代码

/****************************************************************************
 * 
 * file name: 2024-05-11_GetBMPInfo.c
 * author   : [email protected]
 * date     : 2024-05-11
 * function : 获取BMP图片信息。
 * note     : 参考:https://learn.microsoft.com/en-us/previous-versions/ms969901(v=msdn.10)?redirectedfrom=MSDN
 * CopyRight (c)   2024   [email protected]   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;         //应始终为 1
    short 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

标签:字节,int,信息,C语言,获取,BMP,file,定义
From: https://www.cnblogs.com/crazy3min/p/18187353

相关文章

  • 以 LwIP 分析基于C语言的代码文件组织
    转载自:https://blog.csdn.net/jiangjunjie_2005/article/details/22991385时间:2014-04-05  嵌入式系统一般用C语言来实现,当代码规模增大后经常出现各种问题:如何将众多的源文件放置在不同的目录中?头文件.h和源文件.c如何组织?说明文档和源文件如何存放?还要考虑移植。下面以Lw......
  • 系统IO下查看bmp照片信息
    IO编程用系统IO实现查看bmp照片信息设计程序,利用系统IO读取磁盘上指定BMP图片的宽和高,以及BMP图片的大小,并输出到终端,要求图片名称通过命令行传递。/******************************************************************************filename:2024-05-11_GetBmpInfo.c......
  • 42.C语言有关函数的学习整理
    先看一个简单的函数实现的就是将数组里面的数加起来\t缩进相当于Tab键inta[10]={9,8,7,6,5,4,3,2,1,0};for(inti=0;i<10;++i)a[i]=add(a[i],i);for(inti=0;i<10;++i)printf("%d\t",a[i]); intadd(i......
  • GETbmpinfo
    /*************************************************/***@filename: GETbmpinfo*@brief实现对BMP图片位图信息的获取*@[email protected]*@date2024/05/11*@version1.0:在下坂本,有何贵干*@property:none*@notenone*CopyRigh......
  • BMP图片内部结构
    BMP图片内部结构​ BMP文件的数据按照从文件头开始的先后顺序分为四个部分:分别是位图文件头、位图信息头、调色板(24bit位图是没有的)、位图数据(RGB)。(1)位图文件头(Bitmap-FileHeader)包含了图像类型、图像大小、两个保留字以及位图数据存放地址。(2)位图信息头(Bitmap-InformationH......
  • bmp位图文件信息结构体
    /***************************************************filename:BmpInfoStruct.c*author:[email protected]*date:2024/05/11*brief:构造一个结构体用于存储bmp图片的文件信息*note:None**CopyRight(c)2024momolyl@126.......
  • BMP文件格式及相应结构体
    //文件信息结构体typedefstructtag_bitmap_file_header{unsignedshortfile_type;//文件标识,为字母ASCII码“BM”unsignedintfile_size;//位图文件大小,以字节为单位unsignedshortreserved1;//位图文件保留字,必须为0unsignedshortreserved......
  • 获取lcd设备分辨率 色深
    /********************************************************************* filename: get_dev_info.c* author :lzj* date :2024/05/11* function:获取lcd设备分辨率*色深* note :None** CopyRight(c)[email protected]......
  • 利用系统IO读取磁盘上指定BMP图片的宽和高以及大小
    文件IO代码/***************************************************************************************filename:1.c*author: [email protected]*date:2024/05/11*function: 利用系统IO读取磁盘上指定BMP图片的宽和高以及大小*......
  • 获取任意bmp图片的参数函数设计
    /**@Author:[email protected]*@Date:2024-05-0814:24:52*@LastEditors:[email protected]*@LastEditTime:2024-05-1118:57:02*@FilePath:\数据结构text\text,.c*@Description:这是默认设置,请设置`customMade`,打开koroFileHeader查看配置进行设......