【问题标题】:How to save Graphics object as image in C#?如何在 C# 中将 Graphics 对象保存为图像?
【发布时间】:2011-05-09 00:42:57
【问题描述】:

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

需要做一些像截图这样的事情,但我只需要我的应用程序中某个面板的图像,我想在我的应用程序中单击按钮来执行此操作。

最好的问候,普里莫兹


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

            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;
        }
    }
} 

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

【问题讨论】:

    标签: c# image graphics


    【解决方案1】:

    使用 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");
            }
        }
    

    【讨论】:

    • 这对我来说并不完全有效。我在原始问题中添加了我遇到的问题。
    • 你不应该这样画。尝试例如最小化,然后恢复窗口。线没了。当您在 XP 上移动另一个窗口时也会发生同样的事情。请改用控件的 Paint 事件。
    • 我编辑了最初的问题以添加我的绘图代码以在图表上绘制自定义线。你能帮我以正确的方式做吗?
    • 请就此提出一个新问题。
    【解决方案2】:

    回应您的修改:

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

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

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

    修正绘图代码后,您可以使用 Hans 的解决方案。

    【讨论】:

    • 我编辑了最初的问题以添加我的绘图代码以在图表上绘制自定义线。你能帮我以正确的方式做吗?
    • 我在绘画事件中放了什么
    猜你喜欢
    • 2011-07-15
    • 2023-03-27
    • 2020-05-23
    • 2019-07-26
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2010-09-14
    • 2018-10-29
    相关资源
    最近更新 更多