c - 读取 BMP header ,打包。读取错误值

标签 c struct bmp pack

我最近编写了一个程序来读取 BMP 文件的文件头和信息头。我如图所示包装它们,将它们折叠起来,然后打印宽度和高度。不幸的是,宽度和高度不正确。我不知道为什么。也许有点/小尾数问题?如果是这样我不知道如何解决它。我正在 GCC 上编译并运行它。

#pragma pack(1)

typedef struct
{
    unsigned char fileMarker1;       /* 'B' */                       
    unsigned char fileMarker2;       /* 'M' */ 
    unsigned int   bfSize;             
    unsigned short unused1;           
    unsigned short unused2;           
    unsigned int   imageDataOffset;  /* Offset to the start of image data */
 }FILEHEADER;

 typedef struct                       
 { 
    unsigned int   biSize;            
    signed int     width;            /* Width of the image */ 
    signed int     height;           /* Height of the image */ 
    unsigned short planes;             
    unsigned short bitPix;             
    unsigned int   biCompression;      
    unsigned int   biSizeImage;        
    int            biXPelsPerMeter;    
    int            biYPelsPerMeter;    
    unsigned int   biClrUsed;          
    unsigned int   biClrImportant;     
 }INFOHEADER;

 #pragma pack()

......

 fread( &header, sizeof(FILEHEADER), 1, image );

......

 fread( &iheader, sizeof(INFOHEADER), 1, image );

......

 printf("Width: %i\n", iheader.width);
 printf("Height: %i\n", iheader.height);

最佳答案

Windows 位图文件确实以小端存储。因此,假设您的系统是大端字节序,则在加载后您需要反转每个 2 或 4 字节 int 值的字节序。这个IBM article描述了执行此操作的各种方法。

关于c - 读取 BMP header ,打包。读取错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7738660/

相关文章:

c - 无法将字符串存储在结构中

c - 取消引用指向结构的指针 - 使间接操作数无效?

c - 这个程序如何运行 C?

c - 调用 fread 后奇怪的 printf 行为

delphi - delphi TBitmap是否支持alpha channel

c - 使用 Netcat - C 语言向我的微 Controller 发送消息

c - SOCK_STREAM 上的 Http 服务器 - 何时结束连接?

c++ - 是否可以在 c/c++ 中将 8 个字符(每个 1 字节)存储在 double 类型(8 字节)的变量中?

c - 使用结构体指针的源代码

Swift 为 c 中定义的结构定义双指针