c 从BMP中获取数据

标签 c bmp

我发现自己编写了一个简单的程序来从 bmp 文件中提取数据。我刚刚开始,我正处于那些 WTF 时刻之一。

当我运行程序并提供此图像时:http://www.hack4fun.org/h4f/sites/default/files/bindump/lena.bmp

我得到输出:

type: 19778
size: 12
res1: 0
res2: 54
offset: 2621440

实际图像大小为 786,486 字节。为什么我的代码报告 12 个字节?

指定的 header 格式, http://en.wikipedia.org/wiki/BMP_file_format与我的 BMP_FILE_HEADER 结构匹配。那么为什么它会充满错误的信息呢?

图像文件似乎没有损坏,其他图像也给出同样错误的输出。我错过了什么?

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    unsigned short type;
    unsigned int size;
    unsigned short res1;
    unsigned short res2;
    unsigned int offset;
} BMP_FILE_HEADER;

int main (int args, char ** argv) {
    char *file_name = argv[1];

    FILE *fp = fopen(file_name, "rb");

    BMP_FILE_HEADER file_header;

    fread(&file_header, sizeof(BMP_FILE_HEADER), 1, fp);

    if (file_header.type != 'MB') {
        printf("ERROR: not a .bmp");
        return 1;
    }

    printf("type: %i\nsize: %i\nres1: %i\nres2: %i\noffset: %i\n", file_header.type, file_header.size, file_header.res1, file_header.res2, file_header.offset);
    fclose(fp);

    return 0;
}

最佳答案

这里是十六进制的 header :

0000000 42 4d 36 00 0c 00 00 00 00 00 36 00 00 00 28 00
0000020 00 00 00 02 00 00 00 02 00 00 01 00 18 00 00 00

长度字段为字节36 00 0c 00`,按intel顺序排列;作为 32 位值处理,它是 0x000c0036 或十进制 786,486(与保存的文件大小匹配)。

可能您的 C 编译器正在将每个字段与 32 位边界对齐。启用包结构选项、编译指示或指令。

关于c 从BMP中获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13354785/

相关文章:

在C中将十进制数转换为二进制数

c++ - 如何从带符号的零中去掉减号

windows - 如何从剪贴板内存 (uintptr) 中检索图像数据缓冲区?

BMP 图像标题

c++ - BMP文件格式混淆

icons - Ico 格式 - 32 位 PNG 与 32 位 BMP 与 24 位 BMP

c - 在哪里可以获得 CRC(循环冗余校验)代码?

c - 如何使用 C 中的动态内存分配将结构写入文件

c - 如何将大括号括起来的初始化列表作为参数传递?

Python Pygame 无法正确显示图像