我最近发现BMP图像可以具有负高度,这意味着像素在文件中从上到下存储。我们的生产代码拒绝了用户的文件,因为它将高度解释为4294966272(无符号32位值),而实际上它是-1024(有符号32位值),实际上意味着1024像素的高度。我设法查找的BITMAPINFOHEADER格式的最“官方”文档位于Wikipedia,其中宽度也是signed integer
。如何正确验证BMP输入?
答案 0 :(得分:0)
由于BMP格式has been used in Windows since version 2.0我会使用MSDN作为最多"官方"文档。在MSDN中,我们找到以下definition of BITMAPINFOHEADER:
typedef struct tagBITMAPINFOHEADER {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER, *PBITMAPINFOHEADER;
如您所见,biHeight定义为long,通常与signed int相同。如果你的代码没有正确读取这个值,我会说某处有一个bug。
答案 1 :(得分:0)
从无符号32位更改为有符号32位 应该可以解决