C# WPF在Windows Server 2003上调整抗锯齿工件的大小

C# WPF在Windows Server 2003上调整抗锯齿工件的大小,c#,.net,wpf,image-processing,png,C#,.net,Wpf,Image Processing,Png,我正在使用.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,

我正在使用.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);
}
在Windows7上运行时,这完全符合预期,但在WindowsServer2003上运行时,我得到了我认为是抗锯齿的人工制品

显示了当显示在白色背景的网页上时,Server 2003图像在白色区域中如何有额外的水平和垂直灰线,而这些灰线不应该出现在白色区域中

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

关于在WPF中调整图像大小时消除混叠的效果,有一个很好的MSDN文档(http://msdn.microsoft.com/en-us/library/aa970908.aspx)这似乎与我在这里看到的症状相符,但为什么这在Windows7和Server2003之间的工作方式会有所不同呢

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

RenderOptions.SetEdgeMode(group, EdgeMode.Aliased);

据我所知,WPF使用DirectX。这意味着输出在很大程度上取决于图形卡。尝试按如下方式更改宽度和高度:

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

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

AA在XP和Win2003上被关闭,可能是因为驱动程序支持问题。本论坛发布了一些解决方案/reg hacks


经过一周的搜索,我找到了一个解决方案,但不太清楚为什么它能解决问题

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

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

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

不幸的是,这个注册表调整没有效果这是一个数据中心的无头服务器,所以不确定它会有什么样的图形卡,但可以解释的差异。不幸的是,升级到最新的DirectX和调整宽度/高度并没有什么不同