This post originated from an RSS feed registered with .NET Buzz
by -.
Original Post: Image aus einem WPF-Control erzeugen
Feed Title: Norbert Eder - Living .NET
Feed URL: http://feeds.feedburner.com/NorbertEder-Livingnet
Feed Description: Copyright (c)2005, 2006 by Norbert Eder
Früher oder später stößt jeder WPF-Entwickler auf diese Aufgabe: Aus unterschiedlichsten Gründen muss von einem dargestellten Control eine Grafik erzeugt werden. Wer bereits mit Windows Forms gearbeitet hat, versucht nun vergeblich den Weg über CreateGraphics. Dieser Ansatz funktioniert unter der Windows Presentation Foundation nicht. Stattdessen muss ein anderer Kniff angewandt werden.
Im ersten Schritt kann mittels RenderTargetBitmap ein Bitmap mit der gewünschten Größe erstellt werden. Darin hinein wird nun das entsprechende Control gerendert. Nun müssen wir uns eines Kniffes behelfen (da eventuell die Größe nicht gänzlich korrekt ist). Dazu erstellen wir ein Image-Control, welches das Bitmap als Source erhält und aktualisieren die Größe des Elements entsprechend des Inhaltes mittels der Methoden Measure und Arrange. Nun wird das Image mit der korrekten Größe erneut gerendert und beispielsweise einem Objekt vom Typ PngBitmapEncoder übergeben. Nun kann das Image in einen Stream geschrieben und in ein System.Drawing.Image umgewandelt werden. Hier nun ein Beispielcode:
public System.Drawing.Image Convert(
FrameworkElement controlToRender)
{
RenderTargetBitmap rtb = new RenderTargetBitmap(
(int)controlToRender.ActualWidth,
(int)controlToRender.ActualHeight,
90,
90,
PixelFormats.Default);
Visual vis = (Visual)controlToRender;
rtb.Render(vis);
System.Windows.Controls.Image img =
new System.Windows.Controls.Image();
img.Source = rtb;
img.Stretch = Stretch.None;
img.Measure(new System.Windows.Size(
(int)controlToRender.ActualWidth,
(int)controlToRender.ActualHeight));
System.Windows.Size sizeImage = img.DesiredSize;
img.Arrange(new System.Windows.Rect(new
System.Windows.Point(0, 0), sizeImage));
RenderTargetBitmap rtb2 = new RenderTargetBitmap(
(int)rtb.Width,
(int)rtb.Height,
90,
90,
PixelFormats.Default);
rtb2.Render(img);
PngBitmapEncoder png = new PngBitmapEncoder();
png.Frames.Add(BitmapFrame.Create(rtb2));
Stream ms = new MemoryStream();
png.Save(ms);
ms.Position = 0;
System.Drawing.Image retImg =
System.Drawing.Image.FromStream(ms);
return retImg;
}
Zum PngBitmapEncoder: Hier stehen weitere Encoder bereit. Zusätzliche Informationen sind auf der MSDN-Seite zum Thema BitmapEncoder zu finden. Der Vollständigkeit halber hier die Liste der zur Verfügung stehenden Encoder: