Wpf Dpi和像素完美的WritableBitmap

3
我有一个GPU渲染引擎,可以生成纹理。这些纹理被复制到一个WriteableBitmap中。该位图用作普通的Windows Presentation Foundation视图中的ImageSource。
现在,我将dpi设置为120,也就是在Windows控制面板中启用了125%的字体大小设置。
自从更改后,WritableBitmap看起来非常丑陋。它不再是像素完美的,而是看起来像是糟糕的抗锯齿(可能是因为Wpf以某种方式进行了拉伸)。
我尝试了以下设置:
  • 此答案描述了如何从Wpf获取Dpi,并相应地调整了WritableBitmap dpi和Width / Height值。
  • 在包含图像的XAML中禁用UseLayoutRounding并启用SnapToDevicePixels。
但我无法使其看起来好看。我不确定我需要设置哪些值才能获得像素完美的显示。似乎有多个设置彼此依赖。
一个好的答案将解释必须以哪种组合设置哪些设置才能按预期工作。

比听十次还不如一次 - Sinatr
这篇文章的最后一段有帮助吗?https://msdn.microsoft.com/en-us/library/windows/desktop/ee308410%28v=vs.85%29.aspx - Bradley Uffner
你看过这篇文章了吗?- http://blogs.msdn.com/b/patricka/archive/2010/04/15/why-does-a-high-dpi-setting-make-my-application-look-fuzzy-and-have-clipped-text.aspx - AwkwardCoder
1个回答

3
在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
            );

这解决了这个问题。

2
但是如何获取dpi? - Exerion
有人能告诉我们如何获取实际dpi吗?我尝试了以下代码:double scale = VisualTreeHelper.GetDpi(this).DpiScaleX; int dpi = 96 * scale;它似乎在程序启动时给出了正确的比例因子。但是,如果程序运行时比例发生变化,则无法检测到更改。VisualTreeHelper.GetDpi()的进一步调用似乎总是返回相同的结果。这是尽管我在运行程序时更改了Windows设置中的比例。此外,当我将窗口拖动到具有不同比例因子的监视器时,它也应该发生变化。 - Wayne VanWeerthuizen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接