如何将窗体中的面板保存为图片?

4
我有一个表单,它有2个面板。我正在尝试将Panel2的内容保存为图像。我看到过一个关于使用屏幕捕捉来完成此操作的主题,但是我无法再找到该主题了。也读到了关于使用DrawToBitMap方法的信息,但它来自visual studio 2005信息,不确定是否是最新或最合适的解决方案。那么您建议用什么方法将我的Panel2保存为图片,最好是jpg?
更新: 我实施了下面推荐的DrawToBitMap代码,但它只保存了我的panel2的一半(如果这有区别的话,是左半部分)。 因为它只保存了我的panel2的一半,所以我将宽度调用乘以“2”,以使其保存完整的表单。这有点奇怪,对我来说没有意义,因为panel2的宽度应该是完整的而不是其中的一半?
//multiplies the width of panel2 call by 2 to make it save the full panel
Bitmap bmp = new Bitmap(splitContainer1.Panel2.Width * 2, splitContainer1.Panel2.Height);
splitContainer1.Panel2.DrawToBitmap(bmp, splitContainer1.Panel2.Bounds);
bmp.Save(@"C:\Test.bmp");

请查看此线程 - http://stackoverflow.com/questions/2219985/how-to-save-win-form-as-image-pdf - KV Prajapati
2个回答

7

Control.DrawToBitMap在.Net 4中仍然受支持,但有以下注意事项。

从上面的链接中可以得知:

  • DrawToBitmap方法不支持ActiveX控件。如果需要,您可以重写OnPrint事件并提供自定义打印逻辑。

DrawToBitmap方法有以下限制:

  • 对于大位图,可能会抛出ArgumentException异常。最大允许大小因机器而异。
  • DrawToBitmap不支持Windows XP平板电脑版2005操作系统中的Ink控件。
  • 如果TextBox的Visible属性设置为false,则DrawToBitmap不会绘制子TextBox。
  • 容器内的控件以相反的顺序呈现。
  • 对于RichTextBox,DrawToBitmap功能不完整;只绘制位图的边框。

编辑 添加示例和图片:

Bitmap bmp = new Bitmap(panel1.Width,panel1.Height);
panel1.DrawToBitmap(bmp, panel1.Bounds);
bmp.Save(@"C:\Temp\Test.bmp");


如果DrawToBitMap有这么多限制,你会推荐其他替代方案吗? - Fuzz Evans
我实现了你的代码,它只打印了我的panel2的一半……不确定为什么只有一半? - Fuzz Evans
我不得不将panel2.width乘以2才能使其保存整个面板,如果不乘以2,它只会给我一半...这似乎很奇怪。 - Fuzz Evans
是的,这似乎很奇怪,我只是使用了面板的宽度,就得到了整个面板。至于DrawToBitmap的限制,它们似乎更多是边缘情况。如果您遇到问题,可以尝试AVD在评论中给出的链接。 - Mark Hall

1

命名空间 PanelToPDF { public partial class Form1 : Form { public Form1() { InitializeComponent(); } } }

    private void btnExit_Click(object sender, EventArgs e)
    {
        pictureBox.Dispose();
        Application.Exit();
    }

    private static Bitmap DrawControlToBitmap(Control control)
    {
        Bitmap bitmap = new Bitmap(control.Width, control.Height);
        Graphics graphics = Graphics.FromImage(bitmap);
        Rectangle rect = control.RectangleToScreen(control.ClientRectangle);
        graphics.CopyFromScreen(rect.Location, Point.Empty, control.Size);
        return bitmap;
    }
     private void btnToImage_Click(object sender, EventArgs e)
    {
        Bitmap bitmap = DrawControlToBitmap(panel);
        pictureBox.Image = bitmap;
    }     
}

}


这就是我所做的方式,对我来说很有效。 - ivo
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接