C# 禁用WPF图像上的抗锯齿
我正在编写一个小的登录对话框,出于美观的原因,我在对话框顶部嵌入了一个横幅。一切都进行得很顺利,只是默认情况下,WPF会消除整个图像的别名,使其中包含的文本变得模糊 经过一点搜索,前几页的结果表明,人们普遍认为WPF中不能禁用抗锯齿。有人能证实或否认这一点吗 这对我来说是一个小问题——我会把图片中的文字去掉,然后在背景图片上叠加一个带有相同文字的标签,以达到同样的效果(尽管我必须承认,这有点烦人) 谢谢,C# 禁用WPF图像上的抗锯齿,c#,.net,wpf,user-interface,antialiasing,C#,.net,Wpf,User Interface,Antialiasing,我正在编写一个小的登录对话框,出于美观的原因,我在对话框顶部嵌入了一个横幅。一切都进行得很顺利,只是默认情况下,WPF会消除整个图像的别名,使其中包含的文本变得模糊 经过一点搜索,前几页的结果表明,人们普遍认为WPF中不能禁用抗锯齿。有人能证实或否认这一点吗 这对我来说是一个小问题——我会把图片中的文字去掉,然后在背景图片上叠加一个带有相同文字的标签,以达到同样的效果(尽管我必须承认,这有点烦人) 谢谢, Rob据我所知,WPF在缩放位图时总是进行抗锯齿处理。但是,您应该能够通过避免位图缩放来实
Rob据我所知,WPF在缩放位图时总是进行抗锯齿处理。但是,您应该能够通过避免位图缩放来实现您的目标 有两个步骤:
SnapsToDevicePixels=“true”
var DPI = Win32Functions.GetSystemMetrics(SM_CYICON) / SystemParameters.IconHeight * 96;
然后对于位图,执行以下操作:
var scale = bitmapDPI / DPI;
var transform = new ScaleTransform(scale, scale);
这将使位图的像素与设备像素完全匹配。WPF不会拉伸位图,因此不应存在抗锯齿
如果您确实希望在高DPI屏幕上拉伸图像,但不进行抗锯齿处理(例如,将所有像素加倍),只需在您自己的代码中使用您喜欢的算法拉伸位图,并将上述算法用于拉伸的位图。这不是真正的抗锯齿-是亚像素定位导致了问题,我已经在我的博客上写了关于它(以及关于解决问题的控件)的文章:
避免子像素化的另一种(自动)方法:请注意,如果修改了Windows DPI设置(例如使用125%或150%字体大小),则可能会出现完全相同的问题。这也将导致位图被放大,使事情看起来“有趣”(或者更确切地说,丑陋…)。我们可以添加一个关于这个问题的单独问题,因为答案/解决方案非常相同。谢谢Ray-这个评论实际上今天帮了我很多忙!我使用InteropBitmap作为图像源,它总是被缩放到看起来非常难看(尽管位图DPI为96,这与显示DPI不同)。添加一个ScaleTransform来“缩小”有帮助,现在看起来应该这样。赏金马上就要到了,但由于太多限制,我不得不等23个小时才能给你。:)按承诺给予的赏金。:)同时我也对你的答案做了一些改进。