【问题标题】:Wpf Dpi and pixel-perfect WritableBitmapWpf Dpi 和像素完美的 WriteableBitmap
【发布时间】:2015-02-17 13:47:28
【问题描述】:

我有一个生成纹理的 GPU 渲染引擎。这些纹理被复制到 WriteableBitmap 中。此位图用作普通 Windows Presentation Foundation 视图中的 ImageSource。

现在,我将 dpi 设置为 120,也就是说,我在 Windows 控制面板中启用了 125% 的字体大小设置。

自从那次改变之后,WritableBitmap 看起来真的很难看。它不再是像素完美的,看起来像抗锯齿严重(可能是因为 Wpf 以某种方式拉伸它)。

我尝试了以下设置:

  • This answer 描述了如何从 Wpf 获取 Dpi,我相应地调整了 WritableBitmap dpi 和 Width/Height 值。
  • 在包含图像的 XAML 中禁用 UseLayoutRounding 并启用 SnapToDevicePixels。

但我不能让它看起来很好。我不确定我是否理解我必须设置哪些值才能获得像素完美的显示。似乎有多个相互依赖的设置。

一个好的答案是解释如何组合设置哪些设置才能按预期工作。

【问题讨论】:

标签: c# wpf dpi pixel-perfect


【解决方案1】:

在 xaml 中,将 SnapsToDevicePixels 设置为 true。

在设置 WritableBitmap 的类中,查询 ActualWidth 和 ActualHeight。然后将它们与 Dpi 的比例因子相乘(dpi 120 为 1.25,等等)。

var width = ActualWidth * _dpi_x_scale;
var height = ActualHeight * _dpi_y_scale;

我使用这些宽度和高度值来设置 Gpu 上渲染纹理的大小。

在创建 WritableBitmap 时,也要使用这些缩放的宽度/高度,但请确保设置正确的 dpi:

_bitmap = new WriteableBitmap(
            width,
            height,
            _dpi_x, 
            _dpi_y,
            PixelFormats.Pbgra32,
            null
            );

这样就解决了问题。

【讨论】:

  • 但是如何获取 dpi?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多