我正在用 C 编写一个应用程序来解析 Windows 图标文件 (ICO)。
当我在
BITMAPINFOHEADER
结构中读取现有图标条目时,该结构中的所有变量都包含预期的值,但 biHeight
除外,它应包含图像像素的高度,始终是应该是这样。
例如,如果我有一个 64x64 的图标,
biWidth
是 64,但 biHeight
是 128。
这是预期的行为吗?这是我第一次面对
BITMAPINFOHEADER
。
我主要是根据MSDN关于BITMAPINFOHEADER的文章进行操作。
是的,这是正常的。它是“AND”位图掩码和“XOR”位图掩码的添加高度,因此对于任何普通图标,它只是图标高度的 2 倍。 (这些蒙版不再用于 32 位图标;它们是遗留物。)只需除以二即可。
高度字段的数据类型对于 BITMAPCOREHEADER 为 uint16,对于 BITMAPINFOHEADER 或更高版本为 int32。
计算写入高度字段时要存储的值:
let heightToStore = height * (rowOrderIsTopDown ? -1 : 1) * (isEmbededInIco ? 2 : 1);
并在读取高度字段时计算实际高度
let rowOrderIsTopDown = heightRead < 0;
let height = heightRead * (rowOrderIsTopDown ? -1 : 1) / (isEmbededInIco ? 2 : 1);