2011-10-18 66 views
4

私は、(クリップボードバッファを介して)Excelセルに渡す3D WPFビジュアルを持っています。RenderTargetBitmapをSystem.Drawing.Imageに変換する

「通常の」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.DrawImageSystem.Windows.Controls.ImageSystem.Windows.Media.Imaging.RenderTargetBitmap受け入れないということです。唯一System.Drawing.Imageです。

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

答えて

2

これは、私はたぶん私は右の質問を理解していないが、あなたがクリップボードにRenderTargetBitmapをコピーしたい、あなただけのSetImageを呼び出すことができませんでした

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

思い付いた解決策だった?

Dim iRT As RenderTargetBitmap = makeImage() //this is what you do to get the rendertargetbitmap 
    If iRT Is Nothing Then Exit Sub 
    Clipboard.SetImage(iRT) 
2

RenderTargetBitmapのピクセルを新しいBitmapのピクセルバッファに直接コピーできます。 RenderTargetBitmapPixelFormats.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); 
関連する問題