【问题标题】:Dealing with DPI and ID2D1RenderTarget::DrawBitmap处理 DPI 和 ID2D1RenderTarget::DrawBitmap
【发布时间】:2019-06-04 01:33:34
【问题描述】:

我前段时间在 Direct2D 中创建了这个 UI 框架,以便能够绘制/管理我自己的窗口和小部件。我一直在使用它并根据我的需要对其进行更新,并且效果很好。然而,现在高分辨率显示器是新事物,我遇到了一个小问题。以最佳清晰度绘制图像/图标。

由于我使用的是 Direct2D,所有绘图功能都根据目标机器的 DPI/缩放正常工作,当然基于像素的图像除外,因此 DirectX 不会自动管理。

所以,一开始我只是在 96 DPI 中绘制位图,这意味着如果我有一个 10x10 的图标,并且我通过指定目标矩形来使用像 ID2D1RenderTarget::DrawBitmap 这样的函数,我的图像将是为更高的 DPI 按比例放大。这当然会很明显,而且图标会很模糊。

解决此问题的第一次尝试是创建比默认 DPI 96 大 4 倍的图标。然后,使用相同的 ID2D1RenderTarget::DrawBitmap 并知道这些图像大 4 倍,DrawBitmap 将绘制缩小的图标的放大。这有更好的结果,从 150% 的窗口比例开始,它是完美的。

但是,从 4 倍缩小到 1 倍,结果不是很好,图像有些像素化。比在 Photoshop 中做同样的事情要糟糕得多。

我也试过在 DrawBitmap 之前使用 SetTransform,看看效果是否更好,但完全一样。

所以我的问题是,人们如何处理这个问题。我敢肯定,我不是唯一一个……

【问题讨论】:

    标签: c++ direct2d


    【解决方案1】:

    如果您的目标是获得最佳视觉效果,则需要准备不同分辨率的图标组,不仅要缩小尺寸,还要专门设计成较小的尺寸。然后您需要根据当前上下文选择其中之一。

    关于DrawBitmap,你可以尝试不同的插值模式。

    至于人们正在使用的通用解决方案,我认为没有。许多应用程序不能正确地支持这一点,或者如果它们用于控件布局,嵌入的位图资源仍然会被拉伸并且看起来变形或插值并且看起来太模糊。

    【讨论】:

    • 如果我找不到任何其他解决方案,这是我的下一个选择。我试图避免这种情况,因为处理它需要额外的工作和复杂性。这尤其成问题,因为我通常会将多个“精灵”保存到同一张图像中,并在需要时对其进行裁剪。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-25
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    相关资源
    最近更新 更多