Изменения размера сглаживания в WPF в Windows Server 2003 - PullRequest
1 голос
/ 19 апреля 2011

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

Ответы [ 3 ]

1 голос
/ 20 апреля 2011

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

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

1 голос
/ 22 апреля 2011

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

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

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

source = new FormatConvertedBitmap(source, PixelFormats.Pbgra32, source.Palette, 0);
0 голосов
/ 19 апреля 2011

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

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

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

...