我有一个24 bpp,12x12像素的位图图像。当我尝试将它加载到由Simplified Windows BMP Bitmap File Format Specification页面构建的strust时,我得到2个错误:
BITMAPFILEHEADER
中的文件大小大小为零时为54,而当它为54时,reserved2应为0。BITMAPIMAGEHEADER
中的bpp永远不对。fileptr
跳转到随机位置,该位置从内存中读取垃圾而不是位图的实际数据,除非我将其移回文件头并再次手动移动14个字节。
我的问题是:我该如何解决这个问题? 有办法解决这个问题吗?
。
#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);
}
答案 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)