You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在C++中从BMP文件获取LPBITMAPINFOHEADER?

获取BMP文件的LPBITMAPINFOHEADER头信息

别担心,我来一步步帮你搞定这个问题!你已经成功打开了文件,接下来只需要按照BMP文件的结构顺序读取对应的头信息即可,具体步骤如下:

步骤1:添加必要的头文件

首先确保你包含了Windows相关头文件(因为BITMAPFILEHEADER和BITMAPINFOHEADER是Windows API定义的结构体):

#include <windows.h>
#include <stdio.h>

步骤2:补全文件打开的错误检查

你的初始代码没有做错误判断,这很关键——如果文件打开失败,后续操作都会出问题,先补上这部分:

FILE *sFile = fopen("myfile.bmp", "rb");
if (!sFile) {
    printf("无法打开目标BMP文件!\n");
    return 1; // 或者根据你的程序逻辑处理错误
}

步骤3:读取BITMAPFILEHEADER文件头

BMP文件的最开头是BITMAPFILEHEADER结构,它存储了文件类型、文件大小等基础标识信息,必须先读取它才能定位到后面的信息头:

BITMAPFILEHEADER bmpFileHeader;
// 以二进制模式读取文件头(你已经用了rb模式,符合要求)
if (fread(&bmpFileHeader, sizeof(BITMAPFILEHEADER), 1, sFile) != 1) {
    printf("读取BMP文件头失败!\n");
    fclose(sFile);
    return 1;
}

// 验证这是一个合法的BMP文件:检查bfType字段是否为0x4D42(对应ASCII的"BM")
if (bmpFileHeader.bfType != 0x4D42) {
    printf("当前文件不是有效的BMP格式!\n");
    fclose(sFile);
    return 1;
}

步骤4:读取BITMAPINFOHEADER信息头(即你需要的LPBITMAPINFOHEADER)

在BITMAPFILEHEADER之后就是BITMAPINFOHEADER,它包含了图像的宽度、高度、位深度等核心信息。LPBITMAPINFOHEADER本质是指向BITMAPINFOHEADER的指针,所以我们可以先定义结构体变量,再取地址得到指针:

BITMAPINFOHEADER bmpInfoHeader;
if (fread(&bmpInfoHeader, sizeof(BITMAPINFOHEADER), 1, sFile) != 1) {
    printf("读取BMP信息头失败!\n");
    fclose(sFile);
    return 1;
}

// 现在你就得到了LPBITMAPINFOHEADER类型的指针
LPBITMAPINFOHEADER lpInfoHeader = &bmpInfoHeader;

步骤5:使用获取到的头信息

现在你可以通过lpInfoHeader访问图像的各种参数了,比如:

printf("=== BMP图像参数 ===\n");
printf("图像宽度:%d 像素\n", lpInfoHeader->biWidth);
printf("图像高度:%d 像素\n", lpInfoHeader->biHeight);
printf("位深度:%d 位\n", lpInfoHeader->biBitCount);
printf("压缩方式:%u\n", lpInfoHeader->biCompression);

步骤6:清理资源

最后别忘了关闭打开的文件:

fclose(sFile);

完整代码示例

把上面的步骤整合起来,完整可运行的代码如下:

#include <windows.h>
#include <stdio.h>

int main() {
    FILE *sFile = fopen("myfile.bmp", "rb");
    if (!sFile) {
        printf("无法打开目标BMP文件!\n");
        return 1;
    }

    BITMAPFILEHEADER bmpFileHeader;
    if (fread(&bmpFileHeader, sizeof(BITMAPFILEHEADER), 1, sFile) != 1) {
        printf("读取BMP文件头失败!\n");
        fclose(sFile);
        return 1;
    }

    if (bmpFileHeader.bfType != 0x4D42) {
        printf("当前文件不是有效的BMP格式!\n");
        fclose(sFile);
        return 1;
    }

    BITMAPINFOHEADER bmpInfoHeader;
    if (fread(&bmpInfoHeader, sizeof(BITMAPINFOHEADER), 1, sFile) != 1) {
        printf("读取BMP信息头失败!\n");
        fclose(sFile);
        return 1;
    }

    LPBITMAPINFOHEADER lpInfoHeader = &bmpInfoHeader;

    printf("=== BMP信息头详情 ===\n");
    printf("头结构大小:%u 字节\n", lpInfoHeader->biSize);
    printf("图像宽度:%d 像素\n", lpInfoHeader->biWidth);
    printf("图像高度:%d 像素\n", lpInfoHeader->biHeight);
    printf("颜色平面数:%d\n", lpInfoHeader->biPlanes);
    printf("位深度:%d 位\n", lpInfoHeader->biBitCount);
    printf("压缩方式:%u\n", lpInfoHeader->biCompression);
    printf("图像数据大小:%u 字节\n", lpInfoHeader->biSizeImage);

    fclose(sFile);
    return 0;
}

额外注意点

  • 确保你的编译环境支持Windows API(比如使用MSVC或MinGW编译)
  • 部分BMP文件的biSizeImage字段可能为0,此时图像数据的实际大小需要通过宽度 × 高度 × 位深度 / 8计算得出
  • 如果是256色BMP,信息头之后还会跟着颜色表,但如果你的需求只是获取LPBITMAPINFOHEADER,读到这里就足够了

内容的提问来源于stack exchange,提问作者anako

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:22:29