Отключение сглаживания на изображении WPF

Я пишу небольшое диалоговое окно "Вход в систему", и в эстетических целях я поместил баннер в верхней части диалогового окна. Все прошло хорошо, за исключением того, что по умолчанию WPF сглаживает псевдонимы всего изображения, делая текст, содержащийся в нем, очень размытым.

После нескольких поисков первые несколько страниц результатов показали, что распространенное мнение о том, что сглаживание не может быть отключено в WPF. Может ли кто-нибудь подтвердить или иным образом опровергнуть это?

Для меня это небольшая проблема - я вычеркну текст из изображения и вместо этого наложу метку с тем же текстом поверх фонового изображения, чтобы добиться того же эффекта (хотя я должен признать, что это немного раздражает).

Спасибо роб

2 ответа

Решение

Насколько я знаю, WPF всегда делает сглаживание при масштабировании растрового изображения. Однако вы должны быть в состоянии достичь своей цели, избегая масштабирования растрового изображения.

Есть два шага:

  1. Задавать SnapsToDevicePixels="true" на вашем изображении
  2. Установите ScaleTransform для вашего изображения, чтобы масштабировать его так, чтобы один пиксель устройства = один пиксель растрового изображения

Чтобы вычислить необходимый ScaleTransform, вычислите DPI вашего экрана следующим образом:

var DPI = Win32Functions.GetSystemMetrics(SM_CYICON) / SystemParameters.IconHeight * 96;

а затем для растрового изображения выполните:

var scale = bitmapDPI / DPI;
var transform = new ScaleTransform(scale, scale);

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

Если вы хотите растянуть изображение на экранах с высоким разрешением, но без сглаживания (например, удвоить все пиксели), просто растяните растровое изображение в своем собственном коде, используя любой алгоритм, который вам нравится, и используйте вышеприведенное с растянутым растровым изображением.

Это на самом деле не сглаживание - это субпиксельное позиционирование, которое вызывает проблему, я написал об этом (и о контроле, который решает проблему) в моем блоге по адресу:

http://www.nbdtech.com/blog/archive/2008/11/20/blurred-images-in-wpf.aspx

Другие вопросы по тегам