You need to enable JavaScript to run this app. 如何用C语言正确读取BMP文件?自定义结构体读取异常排查
优惠活动
大模型
产品
解决方案
定价
更多

如何用C语言正确读取BMP文件?自定义结构体读取异常排查

C语言解析BMP文件基础信息的功能异常问题

我在开发C语言解析BMP文件基础信息的功能时遇到异常,希望得到可正确实现BMP文件读取的解决方案,具体问题与代码如下:
我需要获取BMP文件的基本信息,为此我分别为BMP文件头、图像头定义了对应结构体。我参考BMP数值规范文档按照要求读取字段值并做校验,但目前只有bfType可以被正确读取,其余所有字段的取值均错误。我的电脑环境下,sizeof(int) = 4

结构体定义

typedef struct BmpFileHeader {
   char bfType[2];
   unsigned int bfSize;
   unsigned short int __bfReserved1;
   unsigned short int __bfReserved2;
   unsigned long int bfOffBits;
} BMPFILEHEADER;

typedef struct BmpImageHeader {
   unsigned int biSize;
   int biWidth;
   int biHeight;
   unsigned short int biPlanes;
   unsigned short int biBitCount;
   unsigned int biCompression;
   unsigned int biSizeImage;
   int biXPelsPerMeter;
   int biYPelPerMeter;
   unsigned int biClrUsed;
   unsigned int biClrImportant;  
} BMPIMAGEHEADER;

打印相关函数实现

void printFileHeader(BMPFILEHEADER fileHeader) {
   printf("\nType: %c%c.\n", fileHeader.bfType[0],fileHeader.bfType[1]);
   printf("Size: %d.\n", fileHeader.bfSize);
   printf("Verify (Must be 0 0): %d %d.\n");
   printf("Offset : %d.\n", fileHeader.bfOffBits);
};

void printImageHeader(BMPIMAGEHEADER imageHeader) {
   printf("\nSize of header: %d.\n", imageHeader.biSize);
   printf("Width: %d.\n", imageHeader.biWidth);
   printf("Height: %d.\n", imageHeader.biHeight);
   printf("Color Planes: %d.\n", imageHeader.biPlanes);
   printf("Bits per Pixel: %d.\n", imageHeader.biBitCount);
   printf("Compression: %d.\n", imageHeader.biCompression);
   printf("Image size: %d.\n", imageHeader.biSizeImage);
   printf("Preferred resolution in pixels per meter (X-Y): %d-%d.\n", imageHeader.biXPelsPerMeter, imageHeader.biYPelPerMeter);
   printf("Number color map: %d.\n", imageHeader.biClrUsed);
   printf("Number of significant colors: %d.\n", imageHeader.biClrImportant);
}

主函数实现

int main() {
   FILE *image;
   BMPFILEHEADER header;
   BMPIMAGEHEADER imageHeader;

   image = fopen("test.bmp", "rb");

   if(!image) {
      printf("Could not open the file %s.", "test.bmp");
      fclose(image);
      return 1;
   }

   fread(&header, sizeof(BMPFILEHEADER), 1,image);
   
   printf("File header information:");
   printFileHeader(header);

   if(header.bfType[0] != 'B' || header.bfType[1] != 'M') {
      printf("The file %s is not a valid BMP.", "test.bmp");
      return 1;
   }

   fread(&imageHeader, sizeof(BMPIMAGEHEADER), 1, image);
   
   printf("\nImage header information:");
   printImageHeader(imageHeader);

   if(imageHeader.biSize != 40 || imageHeader.biCompression != 0 || imageHeader.biBitCount != 24) {
      printf("The file %s is not a valid BMP.", "test.bmp");
      fclose(image);
      return 1;
   }

   fclose(image);
   return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 14:57:04