Как растянуть растровое изображение в WPF без сглаживания пикселей

Я работаю над приложением обработки изображений SEM, написанным в WPF. У меня есть элемент управления отображением изображения, полученный из Canvas, который отображает изображение и наложения с помощью DrawingVisuals (по одному для каждого слоя). Он также реализует масштабирование и панорамирование с помощью масштабирования и преобразования трансляции, применяемые к DrawingVisuals.

Когда я увеличиваю изображение, чтобы видеть отдельные пиксели, они отображаются плавно, очевидно, используя билинейную фильтрацию, чтобы растянуть растровое изображение (не удивительно, поскольку WPF отображается через Direct3D). Однако, для моего варианта использования, я бы предпочел видеть отдельные пиксели как острые прямоугольники, как обычно, в любом графическом редакторе, таком как Photoshop. Поэтому пользователь моего приложения масштабирует изображение → , чтобы работать на уровне пикселей.

Есть ли такая опция в WPF (кроме ручной растяжки растрового изображения перед ее отображением)? Я ничего не смог найти.

спасибо заранее, Збинек Врастил Чешская Республика

Ответы

Ответ 1

Наконец нашел ответ, с некоторой помощью Экспертной биржи. Класс RenderOptions определяет прикрепленное свойство BitmapScalingMode, которое может быть установлено на NearestNeighbor. Итак,

RenderOptions.SetBitmapScalingMode(imageDisplay, BitmapScalingMode.NearestNeighbor);

делает трюк.

Збинек Врастил

Ответ 2

Ненавижу, чтобы помещать демпфер на вещи, но если NearestNeighbor работает как GDI +, это даст вам ограниченный успех. Поскольку вы увеличиваете увеличение в областях с высоким контрастом, вы не можете получить желаемые результаты. В GDI + вы обнаружите, что черные становятся синими, а белые становятся красными - снова подчеркиваю в областях с высоким контрастом! Если это не так в WPF, подумайте, что вам повезло!

Возможно, разработчик WCF мог подтвердить это?

Я обнаружил, что есть больше вариантов для рассмотрения, но я могу говорить только для класса GDI + Graphics, который может быть полезен кому-то.

Graphics graph = e.Graphics;
graph.InterpolationMode = InterpolationMode.NearestNeighbor;
graph.CompositingQuality = CompositingQuality.AssumeLinear;
graph.SmoothingMode = SmoothingMode.None;

Это работает для меня. Я думаю, что SmoothingMode - это трюк. Надеюсь, это поможет кому-то другому.