Wie PixelFormats.IndexedX mit Rendertargetbitmap benutzen?
-
30-09-2019 - |
Frage
Ich suche eine DrawingVisual
(visuell im Beispiel) in eine Bitmap mit der Ansicht mit RenderTargetBitmap
zu machen diese Bitmap gesetzt als Hintergrund zu einem Canvas
wie folgt:
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 letztes Argument zu RenderTargetBitmap
verwenden, rendert das Bild wie erwartet. Allerdings, wenn ich PixelFormats.Indexed2
(oder eine der PixelFormats.IndexedX
) wählen, mein Code die Methode ohne Ausnahme zu verlassen scheint, wird die bmp.Render
Linie nie aufgerufen und damit das Bild nicht auf dem Canvas
angezeigt.
Wie die IndexedX
Pixelformate mit RenderTargetBitmap
benutzen? Oder gibt es andere Möglichkeiten, um den Speicherbedarf des Bildes zu reduzieren? Es verwendet nur drei Farben, also eine Palette mit eher als 32-Bit-RGB den Weg schienen zu gehen.
Lösung
Sie können nicht. RenderTargetBitmap
unterstützt nur das Pbgra32
Pixelformat. Das ist, weil WPF Rendering-System arbeitet vollständig in 32 Bit pro Pixel. Das ist das Format, in dem es Bilder erzeugt, und es ist auch das Format, in dem sie es vorzieht, Bilder in sein, wenn Sie wollen, dass sie zu machen. (Wenn Sie es mit einem Bitmap in einem anderen Format zur Verfügung stellen, wird es in einen 32-Bit konvertieren muß pro-Pixel-Darstellung zuerst.)
Was planen Sie mit diesem Bitmap zu tun? Wenn Sie es in einer WPF-Anwendung machen möchten, werden es brauchen zunächst in jedem Fall zu einem 32bpp Format konvertiert werden, so dass Sie Risiko mit mehr Speicher, wenn Sie versuchen, es zu halten intern in jedem anderen Format. (Sie werden Ihre vermeintlich speichereffiziente Darstellung haben und die Version WPF tatsächlich in der Lage zu arbeiten.) Nicht die zusätzliche CPU-Zeit zu erwähnen, zwischen dem gewählten Format und ein Format ausgegeben Umwandlung kann WPF mit arbeiten.