2010-03-26 30 views
15

Tôi muốn "sao chép vào khay nhớ tạm" một ứng dụng Control của ứng dụng WPF của tôi được vẽ trên màn hình. Vì vậy, tôi cần phải xây dựng một hình ảnh bitmap từ màn hình điều khiển hiện tại của tôi.Nhận hình ảnh bitmap từ một chế độ xem Điều khiển

Có cách nào dễ dàng để làm điều đó không?

Xin cảm ơn trước.

+0

Câu hỏi này/câu trả lời giúp tôi cũng như: http://stackoverflow.com/questions/2557183/drawing- a-wpf-usercontrol-with-databinding-to-an-image –

Trả lời

25

tôi sẽ không gọi nó là dễ dàng ... nhưng thành phần quan trọng là RenderTargetBitmap, mà bạn có thể sử dụng như sau:

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

Vâng, một phần đó là dễ dàng, bây giờ là RTB có các điểm ảnh được lưu trữ trong nội bộ ... nhưng bước tiếp theo của bạn sẽ được đặt ở định dạng hữu ích để đặt nó vào khay nhớ tạm, và tìm ra điều đó có thể lộn xộn ... có rất nhiều lớp liên quan đến hình ảnh mà tất cả tương tác với nhau.

Đây là những gì chúng tôi sử dụng để tạo System.Drawing.Image, mà tôi nghĩ bạn có thể đặt vào khay nhớ tạm.

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 (một hình ảnh mẫu đính kèm) không thể tương tác trực tiếp với các RenderTargetBitmap (một lớp WPF), vì vậy chúng tôi sử dụng một MemoryStream để chuyển đổi nó.

+0

Cảm ơn bạn, đây là câu trả lời của tôi. Điều tuyệt vời là Clipboard.SetImage() yêu cầu một BitmapSource, vì vậy tôi có thể trực tiếp cung cấp cho nó RenderTargetBitmap. Làm việc như một say mê. Bạn có thể gọi nó dễ dàng. Cảm ơn một lần nữa! Bây giờ tôi cần tìm hiểu cách cho phép người dùng thao tác với hình ảnh điều khiển (phóng to nó về cơ bản) trước khi xuất nó sang bitmap có độ phân giải cố định. tôi nghĩ rằng tôi sẽ sao chép màn hình hiện tại như một VisualBrush trong một Viewbox, và để cho người dùng chơi với nó trước khi xuất khẩu. –

+5

Cần lưu ý rằng, trong khi điều này làm việc cho các thành phần WPF bình thường, bất kỳ điều khiển đặc biệt nào chỉ gói một thành phần từ một vùng trời khác (như điều khiển Webbrowser) không tương thích với RenderTargetBitmap. – nextgentech

7

Nếu điều khiển bạn đang cố gắng tạo bitmap từ bên trong StackPanel nó sẽ không hoạt động, bạn sẽ chỉ nhận được một hình ảnh trống.

Jaime Rodriguez có một mảnh tốt mã để làm được việc này trên blog mình:

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; 
} 
Các vấn đề liên quan