我正在使用.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下的图像在透明度方面有一些奇怪的变化。
在WPF(http://msdn.microsoft.com/en-us/library/aa970908.aspx)中调整图像大小时,有一个关于抗锯齿效果的MSDN文档似乎与我的症状相符我在这里看到,但为什么这在Windows 7和Server 2003之间有所不同?
我试图找到切换抗锯齿的方法,使用下面的代码测试这个理论,但它没有任何区别:
RenderOptions.SetEdgeMode(group, EdgeMode.Aliased);
答案 0 :(得分:1)
答案 1 :(得分:1)
经过一周的搜索后,我找到了一个解决方案,但我不确定为什么要解决这个问题。
我注意到正在处理的图像以Bixel32的PixelFormat开始,但RenderTargetBitmap的输出是Pbra32。阅读这种格式的P部分是为了在渲染图像时如何计算Alpha阈值,以便在此阶段可能出现问题。
解决方案是转换首先使用下面的代码行将PixelFormat转换为Pbra32然后执行调整大小
source = new FormatConvertedBitmap(source, PixelFormats.Pbgra32, source.Palette, 0);
答案 2 :(得分:0)
据我所知,WPF使用DirectX。这意味着输出可能在很大程度上取决于显卡。尝试按如下方式更改宽度和高度:
new Rect(0, 0, width - 0.00001d, height - 0.00001d)
如果无法尝试在Win Server 2003计算机上更新视频驱动程序和DirectX。