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

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

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

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

заранее спасибо, Zbynek Vrastil Czech Republic


person Zbynek Vrastil    schedule 04.03.2010    source источник


Ответы (2)


Наконец-то нашел ответ с некоторой помощью Experts Exchange. Класс RenderOptions определяет присоединенное свойство BitmapScalingMode, которому можно присвоить значение NearestNeighbor. Так,

RenderOptions.SetBitmapScalingMode(imageDisplay, BitmapScalingMode.NearestNeighbor);

делает свое дело.

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

person Zbynek Vrastil    schedule 05.03.2010
comment
Прохладный! Избавил меня от многих хлопот. - person Padu Merloti; 02.12.2010
comment
И вы также можете установить его из XAML: <Image RenderOptions.BitmapScalingMode="NearestNeighbor" /> - person Kevin Gosse; 27.12.2011

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

Может быть, это подтвердит разработчик WCF?

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

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

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

person Simon Miller    schedule 16.03.2012