Search code examples
c#wpfsystem.drawingbitmapimagerendertargetbitmap

Convert RenderTargetBitmap into System.Drawing.Image


I have 3D WPF visual that I want to pass into an Excel cell (via clipboard buffer).

With "normal" BMP images it works but I do not know how to convert a RenderTargetBitmap.

My code looks like this:

System.Windows.Media.Imaging.RenderTargetBitmap renderTarget = myParent.GetViewPortAsImage(DiagramSizeX, DiagramSizeY);
System.Windows.Controls.Image myImage = new System.Windows.Controls.Image();
myImage.Source = renderTarget;

System.Drawing.Bitmap pg = new System.Drawing.Bitmap(DiagramSizeX, DiagramSizeY);
System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(pg);
gr.DrawImage(myImage, 0, 0);

System.Windows.Forms.Clipboard.SetDataObject(pg, true);
sheet.Paste(range);

My problem is that gr.DrawImage does not accept a System.Windows.Controls.Image or a System.Windows.Media.Imaging.RenderTargetBitmap; only a System.Drawing.Image.

How do I convert the Controls.Image.Imaging.RenderTargetBitmap into an Image, or are there any easier ways?


Solution

  • This was the solution I came up with

    System.Windows.Media.Imaging.RenderTargetBitmap renderTarget = myParent.GetViewPortAsImage(DiagramSizeX, DiagramSizeY);
    System.Windows.Media.Imaging.BitmapEncoder encoder = new System.Windows.Media.Imaging.PngBitmapEncoder();
    MemoryStream myStream = new MemoryStream();
    
    encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(renderTarget));
    encoder.Save(myStream);
    //
    System.Drawing.Bitmap pg = new System.Drawing.Bitmap(DiagramSizeX, DiagramSizeY);
    System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(pg);
    //
    // Background
    //
    gr.FillRectangle(new System.Drawing.SolidBrush(BKGC), 0, 0, DiagramSizeX, DiagramSizeY);
    //
    gr.DrawImage(System.Drawing.Bitmap.FromStream(myStream), 0, 0);
    System.Windows.Forms.Clipboard.SetDataObject(pg, true);
    
    sheet.Paste(range);