Сохранение 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)
{
//
}
}