捕获矩形后面的图像

时间:2012-02-22 14:56:59

标签: c# winforms

我写了一个小应用程序,它将在我的工作环境中用于裁剪图像。包含图像的窗体(.NET 3.5)有一个透明的矩形,我用它来拖动图像的一部分并点击一个按钮来获取矩形背后的任何内容。

目前我正在使用下面的代码,这导致了我的问题,因为它捕获的区域偏离了几个像素,我认为这与我的CopyFromScreen函数有关。

    //Pass in a rectangle
    private void SnapshotImage(Rectangle rect)
    {
        Point ptPosition = new Point(rect.X, rect.Y);
        Point ptRelativePosition;

        //Get me the screen coordinates, so that I get the correct area
        ptRelativePosition = PointToScreen(ptPosition);

        //Create a new bitmap
        Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);

        //Sort out getting the image
        Graphics g = Graphics.FromImage(bmp);

        //Copy the image from screen
        g.CopyFromScreen(this.Location.X + ptPosition.X, this.Location.Y + ptPosition.Y,   0,  0, bmp.Size, CopyPixelOperation.SourceCopy);
        //Change the image to be the selected image area
        imageControl1.Image.ChangeImage(bmp);  
    }

如果有人能够发现为什么当图像被重新绘制时,我会在这一点上永远感激。此外,ChangeImage函数很好 - 如果我使用一个表单作为选择区域,但是使用一个矩形可以使一些东西变得更加有效,它就可以工作。

2 个答案:

答案 0 :(得分:1)

您已将ptRelativePosition的相对位置检索到屏幕,但实际上并未实际使用 - 您将矩形的位置添加到表单的位置,而不考虑表单的边框。

这是固定的,只需要一些优化:

// Pass in a rectangle
private void SnapshotImage(Rectangle rect)
{
    // Get me the screen coordinates, so that I get the correct area
    Point relativePosition = this.PointToScreen(rect.Location);

    // Create a new bitmap
    Bitmap bmp = new Bitmap(rect.Width, rect.Height, PixelFormat.Format32bppArgb);

    // Copy the image from screen
    using(Graphics g = Graphics.FromImage(bmp)) {
        g.CopyFromScreen(relativePosition, Point.Empty, bmp.Size);
    }

    // Change the image to be the selected image area
    imageControl1.Image.ChangeImage(bmp);  
}

答案 1 :(得分:0)

有趣的是,这是因为图像所在的主窗体和控件之间的空间以及窗体顶部的工具栏将控件和主窗体的顶部分开。为了解决这个问题,我只需在捕获屏幕中修改一行来计算这些像素,如下所示:

g.CopyFromScreen(relativePosition.X + 2, relativePosition.Y+48,  Point.Empty.X, Point.Empty.Y, bmp.Size);

干杯