wpf image bitmap pixels smooth

¿Cómo puedo estirar el mapa de bits en WPF sin suavizar los píxeles?



image bitmap (2)

Estoy trabajando en la aplicación de procesamiento de imágenes SEM, escrita en WPF. Tengo un control de visualización de la imagen, derivado de Canvas, que muestra imágenes y superposiciones utilizando DrawingVisuals (una para cada "capa"). También implementa Zoom & Pan usando scale & translate transform, aplicado en DrawingVisuals.

Cuando hago un acercamiento de la imagen para ver píxeles individuales, se muestran sin problemas, evidentemente utilizando un filtrado bilineal para estirar el mapa de bits (no es de extrañar, ya que WPF se procesa a través de Direct3D). Sin embargo, para mi caso de uso, preferiría ver píxeles individuales como cuadros nítidos, como es habitual en cualquier editor de imágenes como Photoshop. Es por eso que el usuario de mi aplicación amplía la imagen -> para poder operar a nivel de píxel.

¿Existe tal opción en WPF (aparte de estirar manualmente el mapa de bits antes de mostrarlo)? No pude encontrar nada.

gracias de antemano, Zbynek Vrastil Czech Republic


Finalmente encontré una respuesta, con la ayuda de Experts Exchange. Class RenderOptions define la propiedad adjunta BitmapScalingMode, que se puede establecer en NearestNeighbor. Asi que,

RenderOptions.SetBitmapScalingMode(imageDisplay, BitmapScalingMode.NearestNeighbor);

Hace el truco.

Zbynek Vrastil


Odio poner un amortiguador en las cosas, pero si NearestNeighbor funciona como GDI +, entonces esto le dará un éxito limitado. A medida que aumenta la ampliación en áreas de alto contraste, es posible que no obtenga los resultados deseados. En GDI +, los negros se vuelven azules y los blancos se vuelven rojos; ¡nuevamente insisto en áreas de alto contraste! Si este no es el caso en WPF, ¡piense que tiene suerte!

Tal vez un desarrollador de WCF podría confirmar eso?

Descubrí que hay más opciones que considerar, pero solo puedo hablar sobre la clase GDI + Graphics , que podría ser útil para alguien.

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

Esto funciona para mí Creo que el SmoothingMode es el truco. Espero que esto ayude a alguien más allá.