BITMAPINFOHEADER biHeight 是我预期的两倍

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

我正在用 C 编写一个应用程序来解析 Windows 图标文件 (ICO)。

当我在

BITMAPINFOHEADER
结构中读取现有图标条目时,该结构中的所有变量都包含预期的值,但
biHeight
除外,它应包含图像像素的高度,始终是应该是这样。

例如,如果我有一个 64x64 的图标,

biWidth
是 64,但
biHeight
是 128。

这是预期的行为吗?这是我第一次面对

BITMAPINFOHEADER

我主要是根据MSDN关于BITMAPINFOHEADER的文章进行操作。

c winapi icons ico
2个回答
8
投票

是的,这是正常的。它是“AND”位图掩码和“XOR”位图掩码的添加高度,因此对于任何普通图标,它只是图标高度的 2 倍。 (这些蒙版不再用于 32 位图标;它们是遗留物。)只需除以二即可。


0
投票

高度字段的数据类型对于 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);
© www.soinside.com 2019 - 2024. All rights reserved.