我正在学习本教程 http://www.gamedev.net/page/resources/_/technical/game-programming/how-to-load-a-bitmap-r1966我得到了我加载的所有位图标题/信息的错误值。
我已经声明了存储位图标题的结构info
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.biBitCount
是0
。此外,图像的宽度和高度也是错误的,我在标题中找到的唯一正确数据是bmfh.bfType
19778
。
有人知道我的代码有什么问题吗? 再一次,我只是想读取bmp而不是显示它。
PS: 最初的图片是JPEG格式。我使用MS PAINT将其转换为BMP格式,并以BMP格式重新保存。我想知道它会影响价值吗?
答案 0 :(得分:0)
我想你会遇到alignment issue,因为编译器可以选择在他认为合适的情况下对齐结构中的数据。您可以尝试打包您的结构,但我建议读出每个字段并单独填写,这是更多的工作,但它更清晰,避免对齐问题。