Сохранение System.Drawing.Graphics для png или bmp

У меня есть объект Graphics, который я нарисовал на экране, и мне нужно сохранить его в файле png или bmp. Графика, похоже, не поддерживает это напрямую, но это должно быть возможно как-то.

Каковы шаги?

Ответы

Ответ 1

Скопируйте его в Bitmap, а затем вызовите метод растрового изображения Save.

Обратите внимание: если вы буквально рисуете на экране (захватывая контекст экранного устройства), то единственный способ сохранить то, что вы только что нарисовали на экране, - это отменить процесс, рисуя с экрана на Bitmap. Это возможно, но, очевидно, было бы намного проще просто рисовать непосредственно в Bitmap (используя тот же код, который вы используете для рисования на экране).

Ответ 2

Вот код:

Bitmap bitmap = new Bitmap(Convert.ToInt32(1024), Convert.ToInt32(1024), System.Drawing.Imaging.PixelFormat.Format32bppArgb);
Graphics g = Graphics.FromImage(bitmap);

// Add drawing commands here
g.Clear(Color.Green);

bitmap.Save(@"C:\Users\johndoe\test.png", ImageFormat.Png);

Если ваша графика находится в форме, вы можете использовать это:

private void DrawImagePointF(PaintEventArgs e)
{
   ... Above code goes here ...

   e.Graphics.DrawImage(bitmap, 0, 0);
}

Кроме того, чтобы сохранить на веб-странице, вы можете использовать это:

MemoryStream memoryStream = new MemoryStream();
bitmap.Save(memoryStream, ImageFormat.Png);
var pngData = memoryStream.ToArray();

<img src="data:image/png;base64,@(Convert.ToBase64String(pngData))"/>

Графические объекты - это поверхность рисования GDI+. Они должны иметь подключенный контекст устройства для рисования, то есть либо форму, либо изображение.

Ответ 3

Graphics graph = CreateGraphics();
Bitmap bmpPicture = new Bitmap("filename.bmp");

graph.DrawImage(bmpPicture, width, height);

Ответ 4

Вероятно, вы рисуете либо изображение, либо элемент управления. Если на изображении используется

    Image.Save("myfile.png",ImageFormat.Png)

Если при рисовании на элементе управления используйте Control.DrawToBitmap(), а затем сохраните возвращаемое изображение, как указано выше.

Спасибо за исправление - я не знал, что вы можете рисовать непосредственно на экране.

Ответ 5

Попробуйте это, отлично работает для меня...

private void SaveControlImage(Control ctr)
{
    try
    {
        var imagePath = @"C:\Image.png";

        Image bmp = new Bitmap(ctr.Width, ctr.Height);
        var gg = Graphics.FromImage(bmp);
        var rect = ctr.RectangleToScreen(ctr.ClientRectangle);
        gg.CopyFromScreen(rect.Location, Point.Empty, ctr.Size);

        bmp.Save(imagePath);
        Process.Start(imagePath);

    }
    catch (Exception)
    {
        //
    }
}