2009-11-15 5 views
11

Ich schreibe einen kleinen Login-Dialog und habe aus ästhetischen Gründen ein Banner oben im Dialog eingebettet. Alles lief gut, außer dass WPF standardmäßig das gesamte Bild antiassoziiert und den Text, der darin enthalten war, frustrierend verschwommen machte.Antialiasing auf einem WPF-Image deaktivieren

Nach einigem Suchen zeigten die ersten Seiten der Ergebnisse, dass Anti-Aliasing in WPF nicht deaktiviert werden kann. Kann man das bestätigen oder anderweitig bestreiten?

Es ist ein kleines Problem für mich - ich werde den Text aus dem Bild nehmen und stattdessen ein Etikett mit dem gleichen Text über dem Hintergrundbild überlagern, um den gleichen Effekt zu erzielen (obwohl ich zugeben muss, es ist ein bisschen nervig).

Danke, Rob

+0

(automatisch) Weg zur Vermeidung von Unter pixeling: http://stackoverflow.com/a/16984921/2463642 – MaMazav

+0

Beachten Sie, dass das exakt gleiche Problem kann auftreten, wenn die Windows-DPI-Einstellungen geändert wurden (um zB 125% oder 150% Schriftgröße). Dies führt auch dazu, dass Bitmaps hochskaliert werden, wodurch die Dinge "witzig" (oder eher hässlich ...) aussehen. Wir könnten eine separate Frage dazu hinzufügen, da die Antwort/Lösung sehr ähnlich ist. –

Antwort

17

Soweit ich weiß, WPF immer tut Anti-Aliasing, wenn eine Bitmap-Skalierung. Sie sollten jedoch Ihr Ziel erreichen, indem Sie die Bitmap-Skalierung vermeiden.

Es gibt zwei Schritte:

  1. Set SnapsToDevicePixels="true" auf dem Bild
  2. Stellen Sie eine Scaletransform auf Ihrem Bild, um es so zu skalieren, dass ein Gerät Pixel = ein Bitmap Pixel

die berechnen benötigte ScaleTransform, berechnen Sie die DPI Ihres Bildschirms wie folgt:

und dann für die Bitmap, tun:

var scale = bitmapDPI/DPI; 
var transform = new ScaleTransform(scale, scale); 

Dies wird Ihre Bitmap Pixel bewirken genau mit den Geräte Pixeln entsprechen. WPF wird die Bitmap nicht dehnen, daher sollte kein Anti-Aliasing erfolgen.

Wenn Sie Ihr Bild auf High-DPI-Bildschirmen strecken möchten, aber ohne Anti-Aliasing (z. B. doppelte Pixel), dehnen Sie die Bitmap in Ihrem eigenen Code mit dem gewünschten Algorithmus und verwenden Sie das obige mit dem gestreckten Bitmap.

+0

Danke Ray - dieser Kommentar hat mir A LOT heute tatsächlich geholfen! Ich benutzte eine InteropBitmap als Quelle eines Bildes und es wurde immer skaliert, um wirklich hässlich auszusehen (obwohl die Bitmap-DPI 96 war, was sich von der Anzeige DPI unterscheidet). Das Hinzufügen einer ScaleTransform zu "Scale-Down" half nun, es sieht jetzt so aus, als müsste es. Bounty kommt auf, aber wegen SO-Limits muss ich 23 Stunden warten, bevor ich es Ihnen gebe. :) –

+0

Bounty gegeben wie versprochen. :) Ich habe deine Antwort auch zur gleichen Zeit ein wenig verbessert. –