Я изменяю размер 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 я получаю то, что я считаю артефактами сглаживания.
Это изображение показывает, как при отображении на веб-странице с белым фоном сервер 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);