Я изменяю размер PNG в консольном приложении, используя следующий код WPF в .NET 4:
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 я получаюя считаю артефактами сглаживания.
Это изображение показывает, как при отображении на веб-странице с белым фоном изображение Server 2003 имеет дополнительные горизонтальные и вертикальные серые линии вбелая область, которой там быть не должно.
Увеличение одной маленькой секции, чтобы попытаться выяснить, что происходит это изображение показывает, как исходный PNG имеет 1-пиксельную полупрозрачную линию междупрозрачная часть (показана серым и белым в клеточку) и белая область.Оба изображения с измененным размером имеют одну и ту же полупрозрачную линию, но в Server 2003 есть некоторые странные различия в уровне прозрачности.
Существует хороший документ MSDN о влиянии сглаживания при изменении размера изображений в WPF(http://msdn.microsoft.com/en-us/library/aa970908.aspx) это может соответствовать симптомам, которые я вижу здесь, но почему это работает по-разному в Windows 7 и Server 2003 ??
Я пытался найти способы переключения сглаживания, чтобы проверить этотеория с использованием следующего кода, но это не имело никакого значения:
RenderOptions.SetEdgeMode(group, EdgeMode.Aliased);