我正在编写一个小型登录对话框,并且出于美学原因在对话框顶部嵌入了一个横幅。一切都很顺利,除了默认情况下,WPF 抗锯齿整个图像,使包含在其中的文本令人沮丧的模糊。
经过一番搜索,前几页的结果表明,人们普遍认为 WPF 中不能禁用抗锯齿。任何人都可以确认或否认这一点吗?
这对我来说是个小问题——我会从图像中取出文本,而是在背景图像上叠加一个带有相同文本的标签以达到相同的效果(尽管我必须承认,这有点烦人)。
谢谢,罗伯
我正在编写一个小型登录对话框,并且出于美学原因在对话框顶部嵌入了一个横幅。一切都很顺利,除了默认情况下,WPF 抗锯齿整个图像,使包含在其中的文本令人沮丧的模糊。
经过一番搜索,前几页的结果表明,人们普遍认为 WPF 中不能禁用抗锯齿。任何人都可以确认或否认这一点吗?
这对我来说是个小问题——我会从图像中取出文本,而是在背景图像上叠加一个带有相同文本的标签以达到相同的效果(尽管我必须承认,这有点烦人)。
谢谢,罗伯
据我所知,WPF 在缩放位图时总是进行抗锯齿处理。但是,您应该能够通过避免位图缩放来实现您的目标。
有两个步骤:
SnapsToDevicePixels="true"
在您的图像上要计算所需的 ScaleTransform,请计算屏幕的 DPI,如下所示:
var DPI = Win32Functions.GetSystemMetrics(SM_CYICON) / SystemParameters.IconHeight * 96;
然后对于位图,执行:
var scale = bitmapDPI / DPI;
var transform = new ScaleTransform(scale, scale);
这将导致您的位图像素与设备像素完全匹配。WPF 不会拉伸位图,所以应该没有抗锯齿。
如果您确实想在高 DPI 屏幕上拉伸图像但不使用抗锯齿(例如,将所有像素加倍),只需使用您喜欢的任何算法在您自己的代码中拉伸位图,然后使用上面的拉伸位图。
这并不是真正的抗锯齿——它是导致问题的亚像素定位,我已经在我的博客上写过它(以及解决问题的控件):
http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx