【发布时间】:2018-11-19 12:44:08
【问题描述】:
我在 C# 中做了很多手动 GDI+ 绘图,并且总是对 GDI+ 默认使用的明显 (0.5, 0.5) 像素偏移感到恼火(我的想法更符合 IMO 的 (0, 0) 更简单的定义)是左上像素的左上角)。直到最近,我还认为让事情变得“更容易”“”可能只是一个愚蠢的 .NET 事情——我只是在做任何其他事情之前翻译了 (-0.5, -0.5)。直到我偶然发现了 PixelOffsetMode 枚举。
.NET definition | C API definition
typedef enum {
PixelOffsetModeInvalid = QualityModeInvalid,
PixelOffsetModeDefault = QualityModeDefault,
PixelOffsetModeHighSpeed = QualityModeLow,
PixelOffsetModeHighQuality = QualityModeHigh,
PixelOffsetModeNone = QualityModeHigh + 1,
PixelOffsetModeHalf = QualityModeHigh + 2
} PixelOffsetMode;
看来“off by (0.5, 0.5)”是故意的 GDI+ 事情。
在 SO 上也有这 2 个答案:
Looking for details on the PixelOffsetMode Enumeration in .Net, WinForms
后一个问题的答案似乎也有些不正确。 HighSpeed 和 Half (将原点放在左上角像素的左上角的模式,HighSpeed 和 None (将原点放在像素的中心)没有区别左上角像素)。C API 枚举定义的文档甚至证实了这一点。
最让我烦恼的是,即使其中两个选项包含“速度”和“质量”这两个词,您选择的值与速度或质量无关,它只是坐标系的不同定义用于绘图。两者都可以以完全相同的速度产生完全相同的结果。在实践中,这是非常模糊的,知道原点的精确位置对于编写正确的绘图代码至关重要 - 像“质量”或“速度”这样的模糊术语在这里没有帮助。使用不正确的枚举值不会使绘图变慢或质量低下,它只会使其出错。
然而,在开发 GDI+ 时一定有人提出了这些枚举值,并且可能已经想到了 HighQuality 和 HighSpeed 存在的原因。我想知道这个原因 - 可能存在细微差别,或者曾经存在差异但不再相关。
【问题讨论】: