gpt4 book ai didi

c 从 BMP 获取数据

转载 作者:行者123 更新时间:2023-12-04 05:24:32 27 4
gpt4 key购买 nike

我发现自己正在编写一个简单的程序来从 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;
}

最佳答案

我可以在您的代码中找到两个错误。

第一个错误:您必须将结构打包为 1,因此每个类型的大小都与其预期的大小完全一致,因此编译器不会以例如 4 字节对齐方式对其进行对齐。所以在你的代码中,short , 而不是 2 个字节,而是 4 个字节。这个技巧是使用编译器指令来打包最近的结构:

#pragma pack(1)

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

现在它应该正确对齐。

另一个错误在这里:
if (file_header.type != 'MB')

您正在尝试检查 short类型,为 2 个字节,带有 char类型(使用 '' ),即 1 个字节。编译器可能会就此向您发出警告,单引号仅包含 1 个 1 字节大小的字符是规范的。

为了解决这个问题,你可以将这 2 个字节分成 2 个 1 字节的字符,它们是已知的( MB ),并将它们放在一起成为一个 word .例如:
if (file_header.type != (('M' << 8) | 'B'))

如果你看到这个表达式,就会发生这种情况:
'M' (在 ASCII 中是 0x4D)向左移动 8 位,将导致 0x4D00 ,现在您可以在右边的零上添加或或下一个字符: 0x4D00 | 0x42 = 0x4D42 (其中 0x42 在 ASCII 中是 'B')。像这样思考,你可以这样写:
if (file_header.type != 0x4D42)

那么你的代码应该可以工作。

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com