Как сохранить Graphics в картинку?

Я пишу проект основанный на WinFroms. Создал Panel элемент. Переопределил метод отрисовки Canvas_Paint. Хочу всё, что я успел отрисовать на e.Graphis сохранить в картинку (png). Как я могу это сделать?

На форуме уже есть ответы, однако они мне не подходят. Там сначала создают Bitmap, а из него создают Graphics. А у меня Graphics приходит в качестве аргумента.

private void Canvas_Paint(object sender, PaintEventArgs e)
{
    e.Graphics.Clear(_backgroundColor);
    NormalizeView(e.Graphics);
            
    DrawAxes(Canvas.CreateGraphics());
    DrawGraph(e.Graphics);
}

Ответы (1 шт):

Автор решения: Blackmeser
class PanelImage : Panel
{
    public Bitmap Bitmap { get; set; }
    public Graphics BitmapGraphics => Graphics.FromImage(Bitmap);
    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        e.Graphics.DrawImage(Bitmap, e.ClipRectangle);
    }
    public PanelImage()
    {
        Bitmap = new Bitmap(this.Size.Width, this.Size.Height);
    }
    protected override void OnSizeChanged(EventArgs e)
    {
        base.OnSizeChanged(e);
        Bitmap = new Bitmap(Bitmap, this.Size);
    }
}

Что вам нужно сделать:

  1. Рисуете всё, что вам нужно на Bitmap через BitmapGraphics
  2. Применяете обновляете PanelImage, OnPaint сам всё сделает за вас
  3. Сохранить можете через PanelImage.Bitmap.Save() в нужный вам файл
    Например: Bitmap.Save("1.png", System.Drawing.Imaging.ImageFormat.Png)

PS Пока рисуете/обновляете график - не обновляйте сам PanelImage, это медленно, просто считайте области обновления прямоугольниками, и складывайте их через: Rectangle.Union, а потом просто вызываете обновления области PanelImage.Invalidate(rectangle)

→ Ссылка