c# winforms: Getting the screenshot image that has

2019-07-13 22:56发布

I have c# windows form which have several controls on it, part of the controls are located one on another. I want a function that will take for input a control from the form and will return the image that has to be behind the control. for ex: if the form has backgroundimage and contains a button on it - if I'll run this function I'll got the part of backgroundimage that located behind the button. any Idea - and code?

H-E-L-P!!!

2条回答
闹够了就滚
2楼-- · 2019-07-13 23:51

That's my initial guess, but have to test it.

  • Put button invisible
  • capture current screen
  • Crop screen captured to the clientRectangle of the button
  • Restablish button.

    public static Image GetBackImage(Control c) {   
        c.Visible = false;
        var bmp = GetScreen();
        var img = CropImage(bmp, c.ClientRectangle);
        c.Visible = true;
    }
    
    public static Bitmap GetScreen() {
        int width = SystemInformation.PrimaryMonitorSize.Width;
        int height = SystemInformation.PrimaryMonitorSize.Height;
    
        Rectangle screenRegion = Screen.AllScreens[0].Bounds;
        var bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb);
        Graphics graphics = Graphics.FromImage(bitmap);
        graphics.CopyFromScreen(screenRegion.Left, screenRegion.Top, 0, 0, screenRegion.Size);
        return bitmap;
    }
    public static void CropImage(Image imagenOriginal, Rectangle areaCortar) {
        Graphics g = null;
        try {
            //create the destination (cropped) bitmap
            var bmpCropped = new Bitmap(areaCortar.Width, areaCortar.Height);
            //create the graphics object to draw with
            g = Graphics.FromImage(bmpCropped);
    
            var rectDestination = new Rectangle(0, 0, bmpCropped.Width, bmpCropped.Height);
    
            //draw the areaCortar of the original image to the rectDestination of bmpCropped
            g.DrawImage(imagenOriginal, rectDestination, areaCortar, GraphicsUnit.Pixel);
            //release system resources
        } finally {
            if (g != null) {
                g.Dispose();
            }
        }
    }
    
查看更多
我命由我不由天
3楼-- · 2019-07-14 00:00

This is pretty easy to do. Each control on the form has a Size and a Location property, which you can use to instantiate a new Rectangle, like so:

Rectangle rect = new Rectangle(button1.Location, button1.Size);

To get a Bitmap that contains the portion of the background image located behind the control, you first create a Bitmap of the proper dimensions:

Bitmap bmp = new Bitmap(rect.Width, rect.Height);

You then create a Graphics object for the new Bitmap, and use that object's DrawImage method to copy a portion of the background image:

using (Graphics g = Graphics.FromImage(bmp))
{
    g.DrawImage(...); // sorry, I don't recall which of the 30 overloads
        // you need here, but it will be one that uses form1.Image as
        // the source, and rect for the coordinates of the source
}

This will leave you with the new Bitmap (bmp) containing the portion of the background image underneath that control.

Sorry I can't be more specific in the code - I'm at a public terminal. But the intellisense info will tell you what you need to pass in for the DrawImage method.

查看更多
登录 后发表回答