【问题标题】:What is the motivation behind PixelOffsetModeHighSpeed and PixelOffsetModeHighQuality?PixelOffsetModeHighSpeed 和 PixelOffsetModeHighQuality 背后的动机是什么?
【发布时间】: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

What is PixelOffsetMode?

后一个问题的答案似乎也有些不正确。 HighSpeedHalf (将原点放在左上角像素的左上角的模式,HighSpeedNone (将原点放在像素的中心)没有区别左上角像素)。C API 枚举定义的文档甚至证实了这一点。

最让我烦恼的是,即使其中两个选项包含“速度”和“质量”这两个词,您选择的值与速度或质量无关,它只是坐标系的不同定义用于绘图。两者都可以以完全相同的速度产生完全相同的结果。在实践中,这是非常模糊的,知道原点的精确位置对于编写正确的绘图代码至关重要 - 像“质量”或“速度”这样的模糊术语在这里没有帮助。使用不正确的枚举值不会使绘图变慢或质量低下,它只会使其出错。

然而,在开发 GDI+ 时一定有人提出了这些枚举值,并且可能已经想到了 HighQualityHighSpeed 存在的原因。我想知道这个原因 - 可能存在细微差别,或者曾经存在差异但不再相关。

【问题讨论】:

    标签: windows graphics gdi+


    【解决方案1】:

    我不知道动机,但我可以猜测。

    GDI 是一个非常古老的 API,并且出现在 Windows 2000 中。该操作系统的推荐硬件要求是 Pentium II 300MHz,128 MB RAM,最低为 Pentium 133 MHz,32MB RAM。按照今天的标准,这是非常缓慢的硬件。很可能,这就是为什么您在现代 Windows PC 上没有观察到渲染速度的任何差异。

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 2019-08-29
      • 1970-01-01
      • 1970-01-01
      • 2013-10-04
      • 2011-04-09
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      相关资源
      最近更新 更多