我正在尝试从头部开始读取位图,但是fread正在为我跳过字符。
我在标题中使用了这个typedef:
#include <windows.h> // Used for other
#include <cstdio>
typedef struct tagBITMAPHEADER{
WORD wFileType;
DWORD dwFileSize;
WORD dwReserved;
WORD dwReserved2;
DWORD dwBmpDataOffset;
DWORD dwBmpHeaderSize;
DWORD dwWidth;
DWORD dwHeight;
WORD wPlanes;
WORD wBitsPerPixel;
DWORD dwCompression;
DWORD dwBitmapDataSz;
DWORD dwHRes;
DWORD dwVRes;
DWORD dwColors;
DWORD dwImpColors;
} BITMAPHEADER, *PBITMAPHEADER;
在我的代码中,我只使用一个简单的fopen和fread with binary。
#include "ImageLoader.h"
BITMAPHEADER pbhFileInfo;
FILE *fBitmap = fopen(FileName,"rb"); //Open file in read / binary
if (fBitmap) //File is now open
{ fread(&pbhFileInfo,sizeof(BITMAPFILEHEADER),1,fBitmap);
fclose(fBitmap);
}
虽然我的位图以'424DF25A0D'(十六进制)开头,但读入的前两个变量似乎跳过'F25A'
wFileType = 0x4d42 dwFileSize = 0x0000000d
知道可能会发生什么事吗?
提前致谢。
答案 0 :(得分:1)
您的结构由编译器对齐。
您似乎正在使用Visual C ++。在struct
定义之前添加此行:
#pragma pack(push 1)
定义后的这一行
#pragma pack(pop)
要了解详情,请参阅Why isn’t sizeof for a struct equal to the sum of sizeof of each member?
答案 1 :(得分:1)
在我看来,以这种方式使用结构是非常不明智的。是的,在这种情况下,您可以使用编译器特定的pragma获得所需的内容。如果您正在编写Windows设备驱动程序或其他已经非常特定于特定平台的内容,我会认为这是一个可接受的解决方案。
但这是以标准格式加载文件。它的代码可以在任何环境中运行。
就个人而言,我会编写一些代码,将数据从字符数组中提取出来,然后手工将其放入结构中,而不是依靠编译器以正确的方式布置结构,这样fread就会神奇地放入所有小数据都在正确的位置。
答案 2 :(得分:0)
您是否以二进制模式打开文件?如果没有,那么这就是你的问题,因为它会将424DF25A0D中的'0D'转换为其他数据,因为它将其解释为回车符/换行符,而不仅仅是原始二进制数据。