Wpf Dpi和像素完美的WriteableBitmap

时间:2015-02-17 13:47:29

标签: c# wpf dpi pixel-perfect

我有一个GPU渲染引擎,可以生成纹理。这些纹理被复制到WriteableBitmap中。此位图在常规Windows Presentation Foundation视图中用作ImageSource。

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

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

我玩了以下设置:

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

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

一个好的答案将解释如何组合设置哪些设置以使其按预期工作。

1 个答案:

答案 0 :(得分:1)

在xaml 中,将SnapsToDevicePixels设置为true。

在设置WritableBitmap 的类中,查询Ac​​tualWidth和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
            );

这解决了这个问题。