我在C#中进行了相当多的手动GDI +绘图,并且总是被GDI +默认使用的明显(0.5,0.5)像素偏移所困扰(我的思想与IMO更简单的(0,0)定义更兼容是左上角像素的左上角)。直到最近,我认为这可能只是一个愚蠢的.NET事情,使事情变得“更容易”“ - 我只是在做任何其他事情之前翻译(-0.5,-0.5)。直到我偶然发现了PixelOffsetMode
enum。
.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上也有这两个答案:
Looking for details on the PixelOffsetMode Enumeration in .Net, WinForms
后一个问题的答案似乎也是微妙的错误。 HighSpeed
和Half
之间没有区别(这是将原点放在左上角像素的左上角的模式,以及HighSpeed
和None
(其中将原点放在左上角像素的中心。.C API枚举定义的文档甚至证实了这一点。
最让我感到烦恼的是,即使其中两个选项包含“速度”和“质量”这两个词,您选择的值与速度或质量完全无关,它只是坐标系的不同定义用于绘图。两者都能以完全相同的速度产生完全相同的结果。在实践中,这是非常模糊的,并且知道原点的精确位置对于编写正确的绘图代码至关重要 - 诸如“质量”或“速度”之类的模糊术语在这里没有帮助。使用不正确的枚举值不会使绘图变慢或质量低,只会使它错误。
然而,当开发GDI +并且可能已经考虑了HighQuality
和HighSpeed
存在的原因时,有人必须提出这些枚举值。我想知道这个原因 - 也许有一个微妙的区别,或者曾经存在差异,但它已不再相关了。
答案 0 :(得分:0)
我不知道动机,但我可以猜测。
GDI是一个非常古老的API,而且这个东西出现在Windows 2000中。该操作系统的推荐硬件要求是Pentium II 300MHz,128 MB RAM,最小的是Pentium 133 MHz,32MB RAM。按照今天的标准,这是非常慢的硬件。很可能,这就是为什么你没有观察到现代Windows PC上渲染速度的任何差异。