Dealing with DPI and ID2D1RenderTarget::DrawBitmap

Dealing with DPI and ID2D1RenderTarget::DrawBitmap

本文关键字:DrawBitmap ID2D1RenderTarget and with DPI Dealing      更新时间:2023-10-16

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

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

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

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

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

我还尝试在DrawBitmap之前使用SetTransform,所以看看结果是否更好,但它是完全相同的。

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

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

关于绘图位图,您可以尝试使用不同的插值模式。

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