2

这是对上一个问题的跟进——如果跟进违反规则,请见谅!我不确定,也希望能够将完整的答案归功于回答这个问题的人。

我正在尝试获取表单特定部分的屏幕截图,并使用 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);
4

2 回答 2

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);
于 2013-04-03T15:59:57.990 回答
2

可以在这里找到更好的答案。在链接中有正确的计算来获得独立于 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);
于 2014-09-29T14:29:00.100 回答