gpt4 book ai didi

c - BMP{FileHeader, InfoHeader} 结构的问题

转载 作者:行者123 更新时间:2023-11-30 18:07:56 25 4
gpt4 key购买 nike

我想将 bmp 文件加载到 C 内存中。我发现了许多不同类型的 BmpFileHeader 和 BmpInfoHeader 结构。我从 msdn.microsoft.com 获取的最后一个,但它仍然无法从二进制文件中正确读取。带测试文件lena图片尺寸:-1076791624无法分配内存

我错过了什么?谢谢。

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

typedef struct tagBITMAPFILEHEADER {
unsigned short bfType;
unsigned int bfSize;
short bfReserved1;
short bfReserved2;
unsigned int bfOffBits;
} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER {
unsigned int biSize;
int biWidth;
int biHeight;
short biPlanes;
short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
int biXPelsPerMeter;
int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant;
} BITMAPINFOHEADER;

int main(int argc, char *argv[])
{
if(argc != 2)
{
printf("Usage: %s input.bmp\n", argv[0]);
exit(-1);
}

FILE *filePtr;
BITMAPFILEHEADER bitmapFileHeader;
BITMAPINFOHEADER bitmapInfoHeader;
unsigned char *bitmapImage;
int imageIdx=0;
unsigned char tempRGB;

filePtr = fopen(argv[1],"rb");
if (filePtr == NULL)
{
printf("File could not opened\n");
exit(-1);
}

//read the bitmap file header
fread(&bitmapFileHeader, sizeof(bitmapFileHeader), 1, filePtr);

if (bitmapFileHeader.bfType !=0x4D42)
{
fclose(filePtr);
printf("Not a bmp file\n");
exit(-1);
}

fseek(filePtr, bitmapFileHeader.bfOffBits, SEEK_SET);
bitmapImage = (unsigned char*)malloc(sizeof(unsigned char)*bitmapInfoHeader.biSizeImage);
printf("Image Size: %d\n", bitmapInfoHeader.biSizeImage);

if (!bitmapImage)
{
free(bitmapImage);
fclose(filePtr);
printf("Memory could not be allocated\n");
exit(-1);
}

//swap the r and b values to get RGB (bitmap is BGR)
for (imageIdx = 0; imageIdx < bitmapInfoHeader.biSizeImage; imageIdx+=3)
{
tempRGB = bitmapImage[imageIdx];
bitmapImage[imageIdx] = bitmapImage[imageIdx + 2];
bitmapImage[imageIdx + 2] = tempRGB;
}

int i;

for(i = 0; i < bitmapInfoHeader.biSizeImage; i+=3){
printf("R: %c G: %c B: %c\n", bitmapImage[i], bitmapImage[i + 1], bitmapImage[i + 2]);
}

fclose(filePtr);

return 0;

}

最佳答案

我要做的第一件事就是在byte layout上找到权威的说法。这些 header ,然后假设您想继续使用已定义的结构,请在字段偏移量上添加一些断言,例如:

assert(offsetof(BITMAPFILEHEADER, bfType) == 0);     // or whatever
assert(offsetof(BITMAPFILEHEADER, bfSize) == 2); // or whatever
assert(offsetof(BITMAPFILEHEADER, bfOffBits) == 10); // or whatever
etc.

您使用 unsigned int、short 等以及您的编译器选项(尤其是结构打包)可能意味着您的结构字段与实际的 BMP 文件数据(偏移量,可能还有长度)不匹配。

关于c - BMP{FileHeader, InfoHeader} 结构的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4071422/

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