0

我正在关注本教程 http://www.gamedev.net/page/resources/_/technical/game-programming/how-to-load-a-bitmap-r1966并且我遇到了所有错误值的问题我加载的位图标题/信息。

我已经声明了存储位图头信息的结构

typedef struct BITMAPFILE_HEADER {
  WORD  bfType;
  DWORD   bfSize;
  WORD  bfReserved1;
  WORD  bfReserved2;
  DWORD   bfOffBits;
} BITMAPFILE_HEADER;

//Bitmap information header
//provides information specific to the image data
typedef struct BITMAPINFO_HEADER{
  DWORD  biSize;
  LONG   biWidth;
  LONG   biHeight;
  WORD   biPlanes;
  WORD   biBitCount;
  DWORD  biCompression;
  DWORD  biSizeImage;
  LONG   biXPelsPerMeter;
  LONG   biYPelsPerMeter;
  DWORD  biClrUsed;
  DWORD  biClrImportant;
} BITMAPINFO_HEADER;

//Colour palette
typedef struct RGB_QUAD {
  BYTE  rgbBlue;
  BYTE  rgbGreen;
  BYTE  rgbRed;
  BYTE  rgbReserved;
} RGB_QUAD;

之后,我使用以下代码读取位图:

    FILE *in;
    in = fopen("picture.bmp", "rb");

    if (in == NULL)
    {
        printf("Error opening file\n");
    }
    else
    {
        BITMAPFILE_HEADER bmfh;
        BITMAPINFO_HEADER bmih;

        fread(&bmfh, sizeof(BITMAPFILE_HEADER), 1, in);
        fread(&bmih, sizeof(BITMAPINFO_HEADER), 1, in);

        if (bmih.biBitCount != 24)
            printf("not 24");
    }

我的图片是 24 位的,但是当我运行这个程序时,它显示“不是 24”。我尝试在 Visual Studio 中调试它,然后我看到了bmih.biBitCountis 0. 此外,图像的宽度和高度也是错误的,我在标题中找到的唯一正确数据bmfh.bfType19778.

有人知道我的代码有什么问题吗?同样,我只想阅读 bmp 但不显示它。

PS:原图为JPEG格式。我使用 MS PAINT 将其转换为 BMP 格式并以 BMP 格式重新保存。我想知道它会影响价值观吗?

4

1 回答 1

0

我想您遇到了对齐问题,因为编译器可以选择在他认为合适的结构中对齐数据。您可以尝试打包您的结构,但我建议您读出每个字段并单独填写,这是更多的工作,但它更清晰并且避免了对齐问题。

于 2012-05-02T08:06:16.343 回答