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?

¿Fue útil?

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)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top