首页 > 解决方案 > PixelOffsetModeHighSpeed 和 PixelOffsetModeHighQuality 背后的动机是什么?

问题描述

我在 C# 中做了很多手动 GDI+ 绘图,总是对 GDI+ 默认使用的明显 (0.5, 0.5) 像素偏移感到恼火(我的想法更符合 IMO 更简单的 (0, 0) 定义为上左上角像素的左角)。直到最近,我还认为让事情变得“更容易”“”可能只是一个愚蠢的 .NET 事情——我只是在做任何其他事情之前翻译了 (-0.5, -0.5)。直到我偶然发现了PixelOffsetMode枚举。

.NET 定义| C API 定义

typedef enum  {
  PixelOffsetModeInvalid       = QualityModeInvalid,
  PixelOffsetModeDefault       = QualityModeDefault,
  PixelOffsetModeHighSpeed     = QualityModeLow,
  PixelOffsetModeHighQuality   = QualityModeHigh,
  PixelOffsetModeNone          = QualityModeHigh + 1,
  PixelOffsetModeHalf          = QualityModeHigh + 2 
} PixelOffsetMode;

似乎“关闭(0.5,0.5)”是故意的GDI +事情。

SO上也有这两个答案:

在 .Net、WinForms 中寻找有关 PixelOffsetMode 枚举的详细信息

什么是 PixelOffsetMode?

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

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

HighQuality然而,在开发 GDI+ 时一定有人提出了这些枚举值,并且可能已经想到了存在和存在的理由HighSpeed。我想知道这个原因——也许有细微的差别,或者曾经有过差别,但现在已经不相关了。

标签: windowsgraphicsgdi+

解决方案


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

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


推荐阅读