如何在C#中将Graphics对象保存为图像?

时间:2010-11-12 11:38:14

标签: c# image graphics

我有面板和各种控件。我想将此面板的图像保存到文件中,我该怎么做?

不需要做类似屏幕截图的操作,但我需要在我的应用程序中使用某个面板的图像,而我想在我的应用程序中点击按钮来执行此操作。

最好的问候,Primoz


编辑: 我还使用此代码在此面板上绘图

            Graphics g = chartTemperature.CreateGraphics();    
            g.DrawLine(p, prevPoint, e.Location);
            prevPoint = e.Location;

但是我没有把它变成图像。为什么,以及如何解决这个问题?


编辑2:

namespace Grafi
{
    public partial class Form1 : Form
    {

        bool isDrawing = false;
        Point prevPoint;

        public Form1()
        {
            InitializeComponent();
        }

        private void chartTemperature_MouseDown(object sender, MouseEventArgs e)
        {
            isDrawing = true;
            prevPoint = e.Location;
        }

        private void chartTemperature_MouseMove(object sender, MouseEventArgs e)
        {
            Pen p = new Pen(Color.Red, 2); 
            if (isDrawing)
            {
                Graphics g = chartTemperature.CreateGraphics();    
                g.DrawLine(p, prevPoint, e.Location);
                prevPoint = e.Location;

                numOfMouseEvents = 0;              
            }
            p.Dispose();
        }

        private void chartTemperature_MouseUp(object sender, MouseEventArgs e)
        {
            isDrawing = false;
        }
    }
} 

这是我在图表上绘制自定义行的绘图代码。你能帮我做正确的事吗?

2 个答案:

答案 0 :(得分:14)

使用Control.DrawToBitmap()方法。例如:

    private void button1_Click(object sender, EventArgs e) {
        using (var bmp = new Bitmap(panel1.Width, panel1.Height)) {
            panel1.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
            bmp.Save(@"c:\temp\test.png");
        }
    }

答案 1 :(得分:3)

回复您的修改:

如果使用Graphics方法返回的CreateGraphics对象绘制面板,则图形不是永久性的。在下次重绘控件时,将在对象上绘制的任何内容都将被删除。 (有关此主题的更多详细信息,请参阅:http://www.bobpowell.net/picturebox.htmhttp://www.bobpowell.net/creategraphics.htm

当您按照Hans Passant的回答建议使用DrawToBitmap方法时,面板控件将重新绘制,这会导致您的绘图丢失。

相反,如果您希望绘图是永久性的,则需要处理面板控件的Paint事件。每次需要重绘控件时都会引发此事件,并提供包含PaintEventArgs对象的Graphics实例,您可以使用该对象永久地在控件的表面上绘制,就像您使用的一样使用Graphics方法返回的CreateGraphics对象。

一旦您更正了绘图代码,就可以使用Hans的解决方案。