gpt4 book ai didi

c - 从 BMP 文件读取到 C 中的 BMP 头结构

转载 作者:太空宇宙 更新时间:2023-11-04 08:42:38 28 4
gpt4 key购买 nike

我正在尝试获取一个 BMP 文件并将其读入,然后对其中的像素执行操作以更改其颜色。我的问题是我无法将文件中的数据读入两个 BMP header 结构。我能够很好地将所有数据读入第一个结构,但在读入第二个结构时出现段错误。正如您从代码中看到的,第一个结构 FILEHEADER 被读取并包含它应该包含的所有正确数据,但是第二个结构 BMPInfoHeader 没有被正确读取。为什么会出现这个段错误?

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

typedef struct
{ unsigned short int Type; /* Magic identifier */
unsigned int Size; /* File size in bytes */
unsigned short int Reserved1, Reserved2;
unsigned int Offset; /* Offset to data (in B) */
} FILEHEADER; /* 14 Bytes */

typedef struct
{ unsigned int Size; /* Header size in bytes */
int Width, Height; /* Width / Height of image */
unsigned short int Planes; /* Number of colour planes */
unsigned short int Bits; /* Bits per pixel */
unsigned int Compression; /* Compression type */
unsigned int ImageSize; /* Image size in bytes */
int xResolution, yResolution;/* Pixels per meter */
unsigned int Colors; /* Number of colors */
unsigned int ImportantColors;/* Important colors */
} BMPInfoHeader; /* 40 Bytes */

typedef struct
{ unsigned char r; /* Red */
unsigned char b; /* Blue */
unsigned char g; /* Green */
} IMAGE;

int main(int argc, char *argv[]) {

FILE *BMPFile;
FILEHEADER BMPFileHeader;
BMPInfoHeader *InfoHeader;
BMPFile=fopen(argv[1],"rb");
unsigned char *BMPimage;

if (BMPFile==NULL) {
printf("\n\nERROR: File not opened properly\n\n");
return -1;
}

fread(&BMPFileHeader,sizeof(unsigned char),14,BMPFile);
fseek(BMPFile,BMPFileHeader.Offset,SEEK_SET);
fread(InfoHeader,sizeof(unsigned char),40,BMPFile);

if (BMPFileHeader.Type != 0x4D42) {
printf("\n\nERROR with fread\n\n");
return -1;
}

return 0;
}

最佳答案

问题是您定义的 FILEHEADER 未对齐,因此编译器将在字段之间插入填充。读取 bmp 头文件的正常方法是拆分 2 字节魔数(Magic Number)并单独读取:

typedef struct
{
unsigned int Size; /* File size in bytes */
unsigned short int Reserved1, Reserved2;
unsigned int Offset; /* Offset to data (in B) */
} FILEHEADER; /* 12 Bytes */

:

char Magic[2];
FILEHEADER BMPFileHeader;
fread(Magic, 1, 2, BMPFile);
fread(&BMPFileHeader, 1, 12, BMPFile);

由于字节顺序,如果你在大端机器上运行它仍然会有问题。为了完全通用,您需要以字节形式读取文件内容并手动构造多字节值。

关于c - 从 BMP 文件读取到 C 中的 BMP 头结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22967641/

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