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

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

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

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

Спасибо, Rob

Ответ 1

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

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

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

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

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

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

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

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

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