Wpf Dpi 和像素完美的 WriteableBitmap
Wpf Dpi and pixel-perfect WritableBitmap
我有一个生成纹理的 GPU 渲染引擎。这些纹理被复制到 WriteableBitmap 中。此位图用作正常 Windows Presentation Foundation 视图中的 ImageSource。
现在,我将我的 dpi 设置为 120,也就是说,我在 Windows 控制面板中启用了 125% 字体大小设置。
自从那个改变之后,WritableBitmap 看起来真的很难看。它不再是像素完美的并且看起来抗锯齿效果很差(可能是因为 Wpf 正在以某种方式拉伸它)。
我尝试了以下设置:
- This answer 描述了如何从 Wpf 获取 Dpi,我相应地调整了 WritableBitmap dpi 和 Width/Height 值。
- 在包含图像的 XAML 中禁用 UseLayoutRounding 并启用 SnapToDevicePixels。
但我无法让它看起来好看。我不确定我是否理解我必须设置哪些值才能获得像素完美的显示。似乎有多个设置相互依赖。
一个好的答案会解释必须如何组合设置哪些设置才能按预期工作。
在 xaml 中,将 SnapsToDevicePixels 设置为 true。
在设置WritableBitmap的class中查询ActualWidth和ActualHeight。然后将它们与 Dpi 的比例因子相乘(dpi 120 为 1.25,等等)。
var width = ActualWidth * _dpi_x_scale;
var height = ActualHeight * _dpi_y_scale;
我使用这些宽度和高度值来设置 Gpu 上渲染纹理的大小。
创建 WritableBitmap 时,也使用缩放后的 width/height 但确保设置正确的 dpi:
_bitmap = new WriteableBitmap(
width,
height,
_dpi_x,
_dpi_y,
PixelFormats.Pbgra32,
null
);
这解决了问题。
我有一个生成纹理的 GPU 渲染引擎。这些纹理被复制到 WriteableBitmap 中。此位图用作正常 Windows Presentation Foundation 视图中的 ImageSource。
现在,我将我的 dpi 设置为 120,也就是说,我在 Windows 控制面板中启用了 125% 字体大小设置。
自从那个改变之后,WritableBitmap 看起来真的很难看。它不再是像素完美的并且看起来抗锯齿效果很差(可能是因为 Wpf 正在以某种方式拉伸它)。
我尝试了以下设置:
- This answer 描述了如何从 Wpf 获取 Dpi,我相应地调整了 WritableBitmap dpi 和 Width/Height 值。
- 在包含图像的 XAML 中禁用 UseLayoutRounding 并启用 SnapToDevicePixels。
但我无法让它看起来好看。我不确定我是否理解我必须设置哪些值才能获得像素完美的显示。似乎有多个设置相互依赖。
一个好的答案会解释必须如何组合设置哪些设置才能按预期工作。
在 xaml 中,将 SnapsToDevicePixels 设置为 true。
在设置WritableBitmap的class中查询ActualWidth和ActualHeight。然后将它们与 Dpi 的比例因子相乘(dpi 120 为 1.25,等等)。
var width = ActualWidth * _dpi_x_scale;
var height = ActualHeight * _dpi_y_scale;
我使用这些宽度和高度值来设置 Gpu 上渲染纹理的大小。
创建 WritableBitmap 时,也使用缩放后的 width/height 但确保设置正确的 dpi:
_bitmap = new WriteableBitmap(
width,
height,
_dpi_x,
_dpi_y,
PixelFormats.Pbgra32,
null
);
这解决了问题。