【问题标题】:WPF resize anti-aliasing artifacts on Windows Server 2003WPF 在 Windows Server 2003 上调整抗锯齿工件的大小
【发布时间】:2011-08-08 19:38:12
【问题描述】:

我正在使用 .NET 4 中的以下 WPF 代码在控制台应用程序中调整 PNG 的大小:

const int width = 250;
const int height = 179;

DrawingGroup group = new DrawingGroup();
RenderOptions.SetBitmapScalingMode(group, BitmapScalingMode.Fant);
group.Children.Add(new ImageDrawing(source, new Rect(0, 0, width, height)));

DrawingVisual targetVisual = new DrawingVisual();
using (DrawingContext targetContext = targetVisual.RenderOpen())
{
    targetContext.DrawDrawing(group);
    targetContext.Close();

    RenderTargetBitmap target = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
    target.Render(targetVisual);
    BitmapSource resized = BitmapFrame.Create(target);
}

在 Windows 7 上运行时,这完全符合预期,但在 Windows Server 2003 上运行时,我得到了我认为的抗锯齿伪影。

This Image 显示当在具有白色背景的网页上显示时,Server 2003 图像如何在不应存在的白色区域中出现额外的水平和垂直灰线。

放大一小部分以尝试找出正在发生的事情this image 显示了原始 PNG 如何在透明部分(显示为灰色和白色方格)和白色区域之间有一条 1 像素的半透明线。两张调整大小的图像都有相同的半透明线,但在 Server 2003 下的那张在透明度级别上有一些奇怪的变化。

有一个很好的 MSDN 文档关于在 WPF (http://msdn.microsoft.com/en-us/library/aa970908.aspx) 中调整图像大小时抗锯齿的效果,这似乎与我的症状相匹配我在这里看到,但为什么这在 Windows 7 和 Server 2003 之间会有所不同??

我试图找到切换抗锯齿的方法来使用以下代码测试这个理论,但没有任何区别:

RenderOptions.SetEdgeMode(group, EdgeMode.Aliased);

【问题讨论】:

    标签: c# .net wpf image-processing png


    【解决方案1】:

    由于驱动程序支持问题,AA 在 XP 和 Win2003 上被关闭。该论坛帖子指出了一些解决方法/reg hacks。

    http://social.msdn.microsoft.com/forums/en-US/wpf/thread/c16c611e-f7b6-45c2-9f89-b55514817b58/#1773092

    【讨论】:

    • 不幸的是,这个注册表调整没有效果
    【解决方案2】:

    经过一周的搜索,我找到了解决方案,但不太确定为什么它可以解决问题。

    我注意到正在处理的图像以 Bgr32 的 PixelFormat 开始,但 RenderTargetBitmap 的输出是 Pbra32。阅读此格式的 P 部分与渲染图像时如何计算 Alpha 阈值有关,因此认为在此阶段可能会出现问题。

    解决方案是先使用下面的代码行将 PixelFormat 转换为 Pbra32,然后再调整大小

    source = new FormatConvertedBitmap(source, PixelFormats.Pbgra32, source.Palette, 0);
    

    【讨论】:

      【解决方案3】:

      据我所知,WPF 使用 DirectX。这意味着输出可能很大程度上取决于显卡。尝试改变一下宽度和高度,如下所示:

      new Rect(0, 0, width - 0.00001d, height - 0.00001d)
      

      如果没有帮助,请尝试在您的 Win Server 2003 机器上更新视频驱动程序和 DirectX。

      【讨论】:

      • 这是一个数据中心的无头服务器,所以不确定它会有什么样的显卡,但可以解释其中的差异。不幸的是,升级到最新的 DirectX 并调整宽度/高度没有任何区别
      猜你喜欢
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2021-10-01
      • 1970-01-01
      相关资源
      最近更新 更多