7
votes

Does anyone know how to take a screenshot using C# and limit it to take a picture of a specific container/portion of an application. I do not want the whole screen or whole window of the application.

My Panel is simply called: panel1 User would click a "button" and take screenshot of panel1 and attach to email.

I would like to take a screen shot of that section only and then save locally to the C:\ Drive and/or attach or embed into an outlook email.

I read other various things on the internet but most of them had to deal with creating complex changes in take a screenshot of a web browser control which I am not looking for.

6
It's strange how all these answer cover the duplicated part of the question and none the original part state it in the title.Alejandro

6 Answers

7
votes

If you just want to the Panel's screenshot, you can use the built-in DrawToBitmap method.

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

Just note that some controls may not work with this functionality such as the WebBrowser and RichTextBox controls but it should work for most other controls (textbox, labels etc..)

5
votes

I do this using something like

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);
}

I hope this helps

3
votes

An improvement to Asif´s answer:

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;
}
2
votes

Slight modification of 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;
    }

This method will take screenshot immediately. For example, if you change visibility of a button within the panel just before calling this function, the bitmap will contain the button. If this is not desired, use keyboardP's answer.

1
votes

I've found this to save a control as 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();

    }
}

I've found something about outlook here, but I couldn't test it, because I don't have outlook installed on my PC.

1
votes

Modification of KeyboardP's answer. Modified to a static method so it can be used as a helper.

public static Bitmap ScreenShotaControl(Control aControl)
        {
            try
            {
                Bitmap bmp = new Bitmap(aControl.Width, aControl.Height);
                aControl.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
                return bmp;
            }
            catch (Exception)
            {

                throw;
            }
        }

Example usages are as follows:

Bitmap bmp = ScreenShotaControl(aControl);
    Clipboard.SetImage(bmp); //to copy to clipboard

Bitmap bmp = ScreenShotaControl(aControl);
    bmp.Save(@"C:\MyPanelImage.bmp"); //save to specified path

Bitmap bmp = ScreenShotaControl(aControl);
    MemoryStream ms= new MemoryStream();
    bmp.Save(ms, ImageFormat.Jpeg); 
    ContentType ct= new ContentType(); 
    ct.MediaType = MediaTypeNames.Image.Jpeg; 

    MailMessage mail = new MailMessage(); 
    mail.Attachments.Add(new Attachment(ms, ct));  //attach to email