2010-12-03 6 views
4

Ich suche eine DrawingVisual (visuell im Beispiel) zu einer Bitmap mit RenderTargetBitmap mit dem Blick machen auf ein Canvas wie unten dieses Bitmap als Hintergrund festlegen:Wie PixelFormats.IndexedX mit RenderTargetBitmap verwenden?

var bmp = new RenderTargetBitmap(2000, 50, 120, 96, PixelFormats.Indexed2); 
bmp.Render(visual); 
var brush = new ImageBrush(bmp) { Stretch = Stretch.Fill }; 
Canvas.Background = brush; 

Wenn PixelFormats.Default als das letzte Argument zu RenderTargetBitmap, das Bild rendert wie erwartet. Wenn ich jedoch PixelFormats.Indexed2 (oder einen der PixelFormats.IndexedX) wähle, scheint mein Code die Methode ohne eine Ausnahme zu beenden, die bmp.Render Zeile wird nie aufgerufen und daher wird das Bild nicht auf der Canvas angezeigt.

Wie verwendet man die IndexedX Pixelformate mit RenderTargetBitmap? Oder gibt es andere Möglichkeiten, den Speicherbedarf des Bildes zu reduzieren? Es verwendet nur drei Farben, so dass die Verwendung einer Palette anstelle von 32-Bit-RGB der Weg zu gehen schien.

Antwort

9

Sie können nicht. RenderTargetBitmap unterstützt nur das Pixelformat Pbgra32. Das liegt daran, dass das Rendering-System von WPF vollständig in 32 Bit pro Pixel arbeitet. Das ist das Format, in dem es Bilder erzeugt, und es ist auch das Format, in dem Bilder bevorzugt werden, wenn Sie sie darstellen wollen. (Wenn Sie es mit einem Bitmap in einem anderen Format versehen, muss es zuerst in eine 32 Bit pro Pixel-Darstellung konvertiert werden.)

Was planen Sie mit dieser Bitmap? Wenn Sie es in einer WPF-Anwendung rendern möchten, muss es in jedem Fall zuerst in ein 32-Bit-Format konvertiert werden, sodass Sie riskieren, mehr Speicher zu verwenden, wenn Sie versuchen, es intern in einem anderen Format zu halten. (Sie haben Ihre angeblich speichereffiziente Darstellung und die Version WPF kann tatsächlich mit arbeiten.) Ganz zu schweigen von der zusätzlichen CPU-Zeit für die Konvertierung zwischen dem gewählten Format und einem Format, mit dem WPF arbeiten kann.

+0

Danke für die Info Ian, mir war nicht klar, dass das Bild irgendwann im Render-Prozess als Pbgra32 gespeichert werden musste. Sieht so aus, als müsste ich mit dem zusätzlichen Speicherverbrauch leben. –

+0

Interessanterweise läuft die Bitmap in einem Scrollviewer, um ein scrollbares Diagramm zur Verfügung zu stellen. Ich war nicht in der Lage, die gewünschte Leistung aus Vektorzeichnungen zu erhalten, also habe ich auf eine Bitmap zurückgegriffen. –

+0

dann warum sagt die Fehlermeldung nicht so! –