在WPF图像上禁用抗锯齿

问题描述:

我正在写一个小的登录对话框,并且出于美学原因在对话框的顶部嵌入了一条横幅。一切进展顺利,除了默认情况下,WPF反对别名整个图像,使其中包含的文本模糊。在WPF图像上禁用抗锯齿

经过一番搜索,结果的前几页显示,人们普遍认为反锯齿无法在WPF中禁用。任何证实,否则否认这一点?

这对我来说是一个小问题 - 我会将图像从图像中取出,然后在背景图像的顶部叠加一个具有相同文本的标签,以达到相同的效果(尽管我必须承认,这有点儿讨厌)。

感谢, 罗布

+0

另一个为了避免子pixeling(自动)方式: http://*.com/a/16984921/2463642 – MaMazav 2013-06-07 13:28:44

+0

注意,如果在Windows DPI设置已被修改,可能会发生相同问题(使用例如125%或150%的字体大小)。这也会导致位图被放大,使事情看起来“有趣”(或者更确切地说,丑陋...)。我们可以添加一个单独的问题,因为答案/解决方案非常相似。 – 2013-09-17 19:48:16

据我所知,缩放位图时,WPF总是做抗锯齿。但是,您应该能够通过避免位图缩放来实现您的目标。

有两个步骤:

  1. 在图像上设置SnapsToDevicePixels="true"
  2. 设置你的图像上的ScaleTransform缩放它,这样一个设备像素=一个位图像素

要计算需要ScaleTransform,像这样计算你屏幕的DPI:

var DPI = Win32Functions.GetSystemMetrics(SM_CYICON)/SystemParameters.IconHeight * 96; 

,然后为位图,这样做:

var scale = bitmapDPI/DPI; 
var transform = new ScaleTransform(scale, scale); 

这将导致你的位图的像素正好与设备相匹配的像素。 WPF不会拉伸位图,所以不应该有抗锯齿。

如果你想伸高DPI屏幕图像,但没有抗锯齿这样做(例如,双所有像素),只是用你最喜欢的算法舒展在自己的代码位图,并使用上面的拉伸位图。

+0

谢谢雷 - 这个评论实际上帮助我今天很多!我使用InteropBitmap作为图像的来源,并且它总是被缩放以显得非常难看(即使位图DPI是96,这与显示器DPI不同)。将ScaleTransform添加到“缩小”帮助,现在看起来应该如此。赏金即将到来,但由于SO限制,我必须等待23个小时才能提供给你。 :) – 2013-09-12 21:09:16

+0

赏金给予承诺。 :)我同时也改善了你的答案。 – 2013-09-17 19:32:59

这不是真的抗锯齿的 - 这是造成问题的原因,我已经写了关于它的子像素定位(以及有关解决该问题的控制)在我的博客:

http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx