CopyFromScreen坐标关闭

时间:2013-04-03 15:55:40

标签: c# winforms screenshot

这是对前一个问题的跟进 - 抱歉,如果后续违反规则!我不确定并且希望能够给予回答这个问题的人完全回答。

我正在尝试获取表单特定部分的屏幕截图,并使用CopyFromScreen来执行此操作。我需要一个面板的屏幕截图,然后是面板上的项目(有漂浮在它上面的按钮)。

无论如何,当我尝试实现它时,屏幕截图显示为超出面板的左上角。而不是面板本身的屏幕截图,只有一小部分面板在图片的右下方可见,面板上方和左侧的区域实际上是图片。

我的实施在某个地方,我不完全确定在哪里。你们能看到我做错了吗? (再次 - 截图应该只是面板区域的图片。没有别的。)

        Rectangle rect = new Rectangle(0, 0, panel1.Width, panel1.Height);
        Bitmap bmp = new Bitmap(panel1.Width, panel1.Height, PixelFormat.Format32bppArgb);
        Graphics g = Graphics.FromImage(bmp);
        g.CopyFromScreen(panel1.Left, panel1.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);
        bmp.Save("Test.jpg", ImageFormat.Jpeg);

2 个答案:

答案 0 :(得分:3)

当您使用CopyFromScreen时,您必须提供屏幕坐标,在这里您可以给出相对于表单的坐标。

你应该做的是:(如果你的代码在包含面板的表格中)

int borderWidth = (this.Width – this.ClientSize.Width) /2;
int titleBarHeight = this.Height – this.ClientSize.Height – 2 * BorderWidth;
g.CopyFromScreen(this.Left + panel1.Left + titleBarHeight, this.Top + panel1.Top + borderWidth, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);

答案 1 :(得分:2)

可以找到更好的答案here。 在链接中有正确的计算,以获得窗体的左上角独立于FormBorderStyle。

Rectangle r = this.RectangleToScreen(this.ClientRectangle);
int titleHeight = r.Top - this.Top;
int borderWidth = r.Left - this.Left; 

g.CopyFromScreen(this.Left + borderWidth + panel1.Left, this.Top + titleHeight + panel1.Top, 0, 0, bmp.Size, CopyPixelOperation.SourceCopy);