5

Excelセルに(クリップボードバッファーを介して)渡したい3DWPFビジュアルがあります。

「通常の」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.ImageSystem.Windows.Media.Imaging.RenderTargetBitmapSystem.Drawing.Image

Controls.Image.Imaging.RenderTargetBitmapをに変換するにはどうすればよいですImageか、またはもっと簡単な方法はありますか?

4

3 に答える 3

5

RenderTargetBitmapから新しい のピクセル バッファにピクセルを直接コピーできますBitmapRenderTargetBitmapを使用すると想定していることに注意してください。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);
于 2014-02-28T05:38:42.537 に答える
2

これが私が思いついた解決策でした

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);
于 2011-10-19T13:04:20.273 に答える
0

質問の意味がよくわからないかもしれませんが、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)
于 2013-02-19T22:20:07.433 に答える