WPF изменяет размер артефактов сглаживания в Windows Server 2003

Я изменяю размер 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);

person Matt    schedule 19.04.2011    source источник


Ответы (3)


AA был отключен в XP и, вероятно, Win2003 из-за проблем с поддержкой драйверов. Это сообщение на форуме указывает на несколько обходных путей / хаков reg.

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

person Paulczy    schedule 19.04.2011
comment
К сожалению, эта настройка реестра не действует - person Matt; 20.04.2011

После недели поисков я нашел решение, но не совсем понимаю, почему оно решает проблему.

Я заметил, что обрабатываемое изображение начинается с PixelFormat из Bgr32, но вывод RenderTargetBitmap был Pbra32. Чтение части P этого формата связано с тем, как рассчитываются пороговые значения Alpha при рендеринге изображения, поэтому на данном этапе было решено, что что-то может пойти не так.

Решение заключалось в том, чтобы сначала преобразовать PixelFormat в Pbra32 с помощью строки кода ниже, а затем изменить размер

source = new FormatConvertedBitmap(source, PixelFormats.Pbgra32, source.Palette, 0);
person Matt    schedule 22.04.2011

Насколько мне известно, WPF использует DirectX. Это означает, что вывод может сильно зависеть от видеокарты. Попробуйте немного изменить ширину и высоту следующим образом:

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

Если это не помогает, попробуйте обновить видеодрайверы и DirectX на вашем компьютере с Win Server 2003.

person Eddy    schedule 19.04.2011
comment
Это безголовый сервер в центре обработки данных, поэтому не знаю, какая у него видеокарта, но могу объяснить различия. К сожалению, обновление до последней версии DirectX и настройка ширины / высоты не повлияли на - person Matt; 20.04.2011