2010-03-04 12 views
15

Sto lavorando all'applicazione di elaborazione immagini SEM, scritta in WPF. Dispongo di un controllo di visualizzazione delle immagini, derivato da Canvas, che visualizza le sovrapposizioni di immagini con gli stili & utilizzando DrawingVisuals (uno per ogni "livello"). Implementa anche Zoom & Pan utilizzando la scala & translate transform, applicata a DrawingVisuals.Come estendere bitmap in WPF senza livellare i pixel

Quando si ingrandisce l'immagine per vedere i singoli pixel, vengono visualizzati in modo uniforme, utilizzando evidentemente il filtro bilineare per allungare la bitmap (nessuna sorpresa, poiché WPF viene renderizzato tramite Direct3D). Tuttavia, per il mio caso d'uso, preferirei vedere singoli pixel come riquadri nitidi, come al solito in qualsiasi editor di immagini come Photoshop. Ecco perché l'utente della mia app zooma l'immagine -> per essere in grado di operare a livello di pixel.

Esiste tale opzione in WPF (diverso dallo stiramento manuale della bitmap prima di visualizzarlo)? Non ero in grado di trovare nulla.

grazie in anticipo, Zbynek Vrastil Repubblica Ceca

risposta

16

finalmente trovato una risposta, con qualche aiuto da scambio degli esperti. Classe RenderOptions definisce la proprietà associata BitmapScalingMode, che può essere impostata su NearestNeighbor. Quindi,

RenderOptions.SetBitmapScalingMode(imageDisplay, BitmapScalingMode.NearestNeighbor); 

fa il trucco.

Zbynek Vrastil

+0

Cool! Mi ha salvato un sacco di problemi. –

+11

E puoi anche impostarlo da XAML: '' –

0

odio per mettere un ammortizzatore sulle cose, ma se NearestNeighbor opere come GDI +, allora questo vi darà un successo limitato. Aumentando l'ingrandimento in aree con un contrasto elevato potresti non ottenere i risultati desiderati. In GDI + trovi che i neri diventano blu, e i bianchi che diventano rossi - di nuovo io tengo in zone di alto contrasto! Se questo non è il caso in WPF, pensaci fortunato!

Forse uno sviluppatore di WCF potrebbe confermarlo?

Ho trovato che ci sono più opzioni da considerare, ma posso solo parlare per la classe GDI + Graphics, che potrebbe essere utile a qualcuno.

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

questo funziona per me. Penso che lo SmoothingMode sia il trucco. Spero che questo aiuti qualcun altro là fuori.

Problemi correlati