Преобразование RenderTargetBitmap в System.Drawing.Image - PullRequest
4 голосов
/ 18 октября 2011

У меня есть 3D WPF visual, который я хочу передать в ячейку Excel (через буфер буфера обмена).

С "нормальными" изображениями BMP это работает, но я не знаю, как преобразовать RenderTargetBitmap.

Мой код выглядит так:

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);

Моя проблема в том, что gr.DrawImage не принимает System.Windows.Controls.Image или System.Windows.Media.Imaging.RenderTargetBitmap; только System.Drawing.Image.

Как мне преобразовать Controls.Image.Imaging.RenderTargetBitmap в Image, или есть более простые способы?

Ответы [ 3 ]

4 голосов
/ 28 февраля 2014

Вы можете скопировать пиксели из RenderTargetBitmap непосредственно в пиксельный буфер нового Bitmap.Обратите внимание, что я предположил, что ваш RenderTargetBitmap использует PixelFormats.Pbrga32, так как использование любого другого пиксельного формата вызовет исключение из конструктора 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);
2 голосов
/ 19 октября 2011

Это было решение, которое я придумал

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);
0 голосов
/ 20 февраля 2013

Возможно, я не правильно понял вопрос, но вы хотите скопировать RenderTargetBitmap в буфер обмена, не могли бы вы просто вызвать 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)
...