2010-03-04 9 views
15

Ich arbeite an SEM-Bildverarbeitung Anwendung geschrieben in WPF. Ich habe ein Bildanzeigesteuerelement, das von Canvas abgeleitet ist und das Bild & Overlays mit DrawingVisuals anzeigt (eines für jede "Ebene"). Es implementiert auch Zoom & Pan mit Skala & translate transform, auf DrawingVisuals angewendet.Wie kann ich Bitmap in WPF strecken, ohne Pixel zu glätten

Wenn ich das Bild zoome, um einzelne Pixel zu sehen, werden sie glatt angezeigt, offensichtlich mit bilinearer Filterung, um die Bitmap zu dehnen (keine Überraschung, da WPF über Direct3D gerendert wird). Für meinen Anwendungsfall würde ich jedoch lieber einzelne Pixel als scharfe Kästchen betrachten, wie es in jedem Bildbearbeitungsprogramm wie Photoshop üblich ist. Deshalb zoomt der Nutzer meiner App das Bild -> um auf Pixelebene zu operieren.

Gibt es eine solche Option in WPF (abgesehen von der manuellen Dehnung der Bitmap vor der Anzeige)? Ich konnte nichts finden.

Vielen Dank im Voraus, Zbynek Vraštil Tschechien

Antwort

16

Schließlich fand eine Antwort, mit etwas Hilfe von Experten-Austausch. Class RenderOptions definiert die angefügte Eigenschaft BitmapScalingMode, die auf "NearestNeighbor" festgelegt werden kann. Also,

RenderOptions.SetBitmapScalingMode(imageDisplay, BitmapScalingMode.NearestNeighbor); 

macht den Trick.

Zbynek Vraštil

+0

Cool! Ersparte mir eine Menge Ärger. –

+11

Und Sie können es auch von XAML setzen: '' –

0

Hass einen Dämpfer auf die Dinge zu setzen, aber wenn NearestNeighbor funktioniert wie GDI +, dann wird dies Sie einen begrenzten Erfolg geben. Wenn Sie die Vergrößerung in Bereichen mit hohem Kontrast erhöhen, erhalten Sie möglicherweise nicht die gewünschten Ergebnisse. In GDI + findet man Schwarz, das blau wird und Weiß wird rot - wieder betone ich in Bereichen mit hohem Kontrast! Wenn dies in WPF nicht der Fall ist, denken Sie sich glücklich!

Vielleicht könnte ein WCF-Entwickler das bestätigen?

Ich habe festgestellt, dass es mehr Optionen zu berücksichtigen gibt, aber ich kann nur für die Klasse GDI + Graphics sprechen, die für jemanden nützlich sein könnte.

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

Das funktioniert für mich. Ich denke, die SmoothingMode ist der Trick. Hoffe, das hilft jemand anderem da draußen.