繁体   English   中英

WPF DPI和像素完美的WritableBitmap

[英]Wpf Dpi and pixel-perfect WritableBitmap

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

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

自从更改以来,WritableBitmap看起来真的很丑。 它不再是完美的像素,并且看起来抗锯齿性很差(可能是因为Wpf以某种方式对其进行了拉伸)。

我玩了以下设置:

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

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

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

在xaml中 ,将SnapsToDevicePixels设置为true。

在设置WritableBitmap的类中 ,查询Ac​​tualWidth和ActualHeight。 然后将其与Dpi的比例因子相乘(对于dpi 120,为1.25)。

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

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

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

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

这样就解决了问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM