2013-04-14 41 views
6

Có ai biết cách chụp ảnh màn hình bằng C# và giới hạn ảnh chụp một vùng chứa/phần cụ thể của ứng dụng hay không. Tôi không muốn toàn bộ màn hình hoặc toàn bộ cửa sổ của ứng dụng.C# Chụp màn hình điều khiển .net trong ứng dụng và đính kèm vào Outlook Email

Bảng điều khiển của tôi được gọi đơn giản: panel1 Người dùng sẽ nhấp vào "nút" và chụp ảnh màn hình panel1 và đính kèm vào email.

Tôi chỉ muốn chụp ảnh màn hình của phần đó và sau đó lưu cục bộ vào C: \ Drive và/hoặc đính kèm hoặc nhúng vào email xem.

Tôi đọc nhiều thứ khác trên internet nhưng hầu hết trong số họ phải đối phó với việc tạo ra những thay đổi phức tạp trong chụp ảnh màn hình điều khiển trình duyệt web mà tôi không tìm kiếm.

+0

thể trùng lặp của [C#: làm thế nào để có một ảnh chụp màn hình của một phần của màn hình] (http://stackoverflow.com/questions/3306600/c- – MoonKnight

Trả lời

5

Tôi làm điều này bằng một cái gì đó giống như

public static void TakeCroppedScreenShot(
    string fileName, int x, int y, int width, int height, ImageFormat format) 
{ 
    Rectangle r = new Rectangle(x, y, width, height); 
    Bitmap bmp = new Bitmap(r.Width, r.Height, PixelFormat.Format32bppArgb); 
    Graphics g = Graphics.FromImage(bmp); 
    g.CopyFromScreen(r.Left, r.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 
    bmp.Save(fileName, format); 
} 

Tôi hy vọng điều này sẽ giúp

+0

Trên thực tế, đã có một câu hỏi với điều này: http://stackoverflow.com/questions/3306600/c-how-to-take -a-ảnh chụp màn hình-of-a-phần-of-screen – MoonKnight

4

Nếu bạn chỉ muốn các Panel's ảnh chụp màn hình, bạn có thể sử dụng được xây dựng trong DrawToBitmap phương pháp.

Bitmap bmp = new Bitmap(myPanel.Width, myPanel.Height); 
myPanel.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
bmp.Save(@"C:\MyPanelImage.bmp"); 

Chỉ cần lưu ý một số điều khiển có thể không hoạt động với chức năng này như WebBrowserRichTextBox điều khiển nhưng nó phải làm việc cho hầu hết các điều khiển khác (textbox, nhãn vv ..)

+0

Cảm ơn bạn, 2 dòng này là chìa khóa của những gì tôi đã mất tích. Bitmap bmp = bitmap mới (myPanel.Width, myPanel.Height); myPanel.DrawToBitmap (bmp, Hình chữ nhật mới (0, 0, bmp.Width, bmp.Height)); – brink668

+0

Điều này trả lời nửa đầu của câu hỏi tạo ảnh chụp màn hình. ** Sau đó, ** triển vọng và nội dung. Nhưng tôi đã ở đây cho phần đầu tiên. – Bitterblue

1

tôi đã tìm thấy này để tiết kiệm một điều khiển như bitmap:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 
    private void Button1_Click(object sender, EventArgs e) 
    { 
     SaveAsBitmap(panel1,"C:\\path\\to\\your\\outputfile.bmp"); 
    } 

    public void SaveAsBitmap(Control control, string fileName) 
    { 
     //get the instance of the graphics from the control 
     Graphics g = control.CreateGraphics(); 

     //new bitmap object to save the image 
     Bitmap bmp = new Bitmap(control.Width, control.Height); 

     //Drawing control to the bitmap 
     control.DrawToBitmap(bmp, new Rectangle(0, 0, control.Width, control.Height)); 

     bmp.Save(fileName); 
     bmp.Dispose(); 

    } 
} 

tôi đã tìm thấy một cái gì đó về triển vọng here, nhưng tôi không thể kiểm tra nó, bởi vì tôi không có triển vọng được cài đặt trên máy tính của tôi.

2

sửa đổi Chếch Killercam's answer:

public static Bitmap takeComponentScreenShot(Control control) 
    { 
     // find absolute position of the control in the screen. 
     Control ctrl = control; 
     Rectangle rect = new Rectangle(Point.Empty, ctrl.Size); 
     do 
     { 
      rect.Offset(ctrl.Location); 
      ctrl = ctrl.Parent; 
     } 
     while (ctrl != null); 

     Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 
     Graphics g = Graphics.FromImage(bmp); 

     g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 

     return bmp; 
    } 

phương pháp này sẽ đưa ảnh chụp màn hình ngay. Ví dụ, nếu bạn thay đổi khả năng hiển thị của một nút trong bảng điều khiển ngay trước khi gọi chức năng này, bitmap sẽ chứa nút. Nếu điều này không mong muốn, hãy sử dụng keyboardP's answer.

2

Một cải tiến để Asif's câu trả lời:

public static Bitmap takeComponentScreenShot(Control control) 
{ 
    // find absolute position of the control in the screen. 
    Rectangle rect=control.RectangleToScreen(control.Bounds); 

    Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb); 
    Graphics g = Graphics.FromImage(bmp); 

    g.CopyFromScreen(rect.Left, rect.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy); 

    return bmp; 
} 
+0

Cải tiến này như thế nào? – beresfordt

+0

Các logic khác để tính toán hình chữ nhật một số lần thất bại –

+0

Tại sao khác thất bại và công việc này? Những thứ như thế này rất hữu ích để đưa vào câu trả lời! – beresfordt

Các vấn đề liên quan