Как растянуть растровое изображение в 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
- это трюк. Надеюсь, это поможет кому-то другому.