使用BITMAPINFOHEADER的BMP中的宽度字段是否为负值?

问题描述 投票:1回答:2

我最近发现BMP图像可以具有负高度,这意味着像素在文件中从上到下存储。我们的生产代码拒绝了用户的文件,因为它将高度解释为4294966272(无符号32位值),而实际上它是-1024(有符号32位值),实际上意味着1024像素的高度。我设法找到的BITMAPINFOHEADER格式的最“官方”文档是在Wikipedia,它说宽度也是signed integer。如何正确验证BMP输入?

file-format bmp
2个回答
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。


0
投票

从无符号32位更改为有符号32位应该修复它

© www.soinside.com 2019 - 2024. All rights reserved.