2010-03-26 28 views
15

我想「複製到剪貼板」我的WPF應用程序的Control在屏幕上繪製的內容。 因此,我需要從我的Control當前顯示中創建一個位圖圖像。從控制視圖獲取位圖圖像

有沒有簡單的方法來做到這一點?

在此先感謝。

+0

這個問題/答案幫助我還有: http://stackoverflow.com/questions/2557183/drawing- a-wpf-usercontrol-with-databinding -a-image – 2012-08-26 21:04:33

回答

25

我不會容易把它......但關鍵部件是RenderTargetBitmap,您可以使用如下:

RenderTargetBitmap rtb = new RenderTargetBitmap((int)control.ActualWidth, (int)control.ActualHeight, 96, 96, PixelFormats.Pbgra32); 
rtb.Render(control); 

那麼,這部分很簡單,現在的RTB中存儲的像素在內部......但是你的下一步將把它放在一個有用的格式中,將它放在剪貼板上,然後弄清楚這可能是混亂的......有很多圖像相關的類都會相互影響。

下面是我們用來創建一個System.Drawing.Image,我認爲你應該能夠放在剪貼板上。

PngBitmapEncoder png = new PngBitmapEncoder(); 
png.Frames.Add(BitmapFrame.Create(rtb)); 
MemoryStream stream = new MemoryStream(); 
png.Save(stream); 
Image image = Image.FromStream(stream); 

System.Drawing.Image對象(表單圖像)不能直接與RenderTargetBitmap(WPF的類)進行交互,所以我們使用一個MemoryStream把它轉換。

+0

謝謝,這是我的答案。 好的是Clipboard.SetImage()需要一個BitmapSource,所以我可以直接給它RenderTargetBitmap。奇蹟般有效。你可以稱之爲簡單。再次感謝 ! 現在我需要弄清楚如何允許用戶在將控件導出到固定分辨率位圖之前操縱控件可視化(本質上將其縮放)。我想我會將當前顯示的內容作爲VisualBrush複製到Viewbox中,讓用戶在導出之前使用它。 – 2010-03-26 14:31:45

+5

值得注意的是,儘管這適用於普通的WPF組件,但任何僅僅從不同空域(比如Webbrowser控件)包裝組件的特殊控件都與RenderTargetBitmap不兼容。 – nextgentech 2013-02-08 06:25:19

7

如果您試圖創建位圖的控件位於StackPanel之內,則該控件無效,您只會得到空白圖像。

海梅·羅德里格斯具有良好的一段代碼來解決這個問題上他的blog

private static BitmapSource CaptureScreen(Visual target, double dpiX, double dpiY) 
{ 
    if (target == null) 
    { 
     return null; 
    } 
    Rect bounds = VisualTreeHelper.GetDescendantBounds(target); 
    RenderTargetBitmap rtb = new RenderTargetBitmap((int)(bounds.Width * dpiX/96.0), 
                (int)(bounds.Height * dpiY/96.0), 
                dpiX, 
                dpiY, 
                PixelFormats.Pbgra32); 
    DrawingVisual dv = new DrawingVisual(); 
    using (DrawingContext ctx = dv.RenderOpen()) 
    { 
     VisualBrush vb = new VisualBrush(target); 
     ctx.DrawRectangle(vb, null, new Rect(new Point(), bounds.Size)); 
    } 
    rtb.Render(dv); 
    return rtb; 
}