Convertir RenderTargetBitMap en System.Drawing.image
-
26-10-2019 - |
Pregunta
Tengo Visual WPF 3D que quiero pasar a una celda de Excel (a través del búfer de portapapeles).
Con imágenes BMP "normales", pero no sé cómo convertir un RenderTargetBitmap
.
Mi código se ve así:
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);
Mi problema es que gr.DrawImage
no acepta un System.Windows.Controls.Image
o System.Windows.Media.Imaging.RenderTargetBitmap
; solo un System.Drawing.Image
.
¿Cómo convierto el Controls.Image.Imaging.RenderTargetBitmap
en una Image
, ¿o hay formas más fáciles?
Solución 2
Esta fue la solución que se me ocurrió
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);
Otros consejos
Puedes copiar los píxeles del RenderTargetBitmap
directamente en el búfer de píxeles de un nuevo Bitmap
. Tenga en cuenta que he asumido que tu RenderTargetBitmap
usos PixelFormats.Pbrga32
, ya que el uso de cualquier otro formato de píxel lanzará una excepción del constructor de RenderTargetBitmap
.
var bitmap = new Bitmap(renderTarget.PixelWidth, renderTarget.PixelHeight,
PixelFormat.Format32bppPArgb);
var bitmapData = bitmap.LockBits(new Rectangle(Point.Empty, bitmap.Size),
ImageLockMode.WriteOnly, bitmap.PixelFormat);
renderTarget.CopyPixels(Int32Rect.Empty, bitmapData.Scan0,
bitmapData.Stride*bitmapData.Height, bitmapData.Stride);
bitmap.UnlockBits(bitmapData);
Tal vez no entiendo bien la pregunta, pero desea copiar un RendergetBitMap en el portapapeles, ¿no podría simplemente llamar a SetImage?:
Dim iRT As RenderTargetBitmap = makeImage() //this is what you do to get the rendertargetbitmap
If iRT Is Nothing Then Exit Sub
Clipboard.SetImage(iRT)