位图文件未按正确的顺序保存在内存中

时间:2017-12-15 18:51:18

标签: c bitmap

我有一个24 bpp,12x12像素的位图图像。当我尝试将它加载到由Simplified Windows BMP Bitmap File Format Specification页面构建的strust时,我得到2个错误:

    1. struct BITMAPFILEHEADER中的文件大小大小为零时为54,而当它为54时,reserved2应为0。
    2. BITMAPIMAGEHEADER中的bpp永远不对。
    3. 同一结构中的图像大小永远不对。
    4. 文件指针fileptr跳转到随机位置,该位置从内存中读取垃圾而不是位图的实际数据,除非我将其移回文件头并再次手动移动14个字节。 我的问题是:我该如何解决这个问题? 有办法解决这个问题吗?


  1. #ifndef LOADBMP
    #define LOADBMP
    
    typedef struct BITMAPFILEHEADER //total of 14 bytes
    {
        unsigned char bfType[2];
        unsigned long bfSize;
        unsigned short Reserved1;
        unsigned short Reserved2;
        unsigned long bOffBits;
    }BITMAPFILEHEADER;
    
    typedef struct BITMAPIMAGEHEADER
    {
        unsigned long bisize;
        unsigned long widh;
        unsigned long height;
        unsigned short biplanes;
        unsigned short bpp;
        unsigned long compType;
        unsigned long Image_Size;
        unsigned long biXPelsPerMeter;
        unsigned long biYPelsPerMeter;
        unsigned long ClrUsed;
        unsigned long Clrimp;
    }BITMAPIMAGEHEADER;
    
    #endif //LOADBMP
    

    主:

    #include <string.h>
    #include <stdio.h>
    #include "LOADBMP.h"
    #include "ERROR.h"
    
    void main()
    {
        BITMAPFILEHEADER BFH;
        BITMAPIMAGEHEADER BIH;
        FILE *fileptr = fopen("C:\\Users\\mishe\\Desktop\\BMP.bmp", "rb");
        unsigned char *image;
        fread_s(&BFH, sizeof(BITMAPFILEHEADER), sizeof(BITMAPFILEHEADER), 1, fileptr);
        rewind(fileptr);
        fseek(fileptr, 14, SEEK_CUR);
        fread_s(&BIH, sizeof(BITMAPIMAGEHEADER), sizeof(BITMAPIMAGEHEADER), 1, fileptr);
    }
    

1 个答案:

答案 0 :(得分:1)

在Windows中,您应添加#include <windows.h>并使用定义为BITMAPFILEHEADER的{​​{1}}和BITMAPINFOHEADER

如果您定义自己的wingdi.h,那么BITMAPFILEHEADER运算符无法保证按预期返回14,因为结构可以填充到成员对齐。

如果您没有在Windows上编译或Windows头文件不可用,则使用编译器特定关键字来关闭结构对齐。见Byte Count for a Struct not representing correct amount.

或者,如下所示读取54个字节(再次,假设您不在大端机器上)

sizeof(BITMAPFILEHEADER)