如何用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
相关产品推荐
相关产品推荐

