Сохранить пользовательскую растровую графику в C#
Я создал программу, которая позволяет пользователям рисовать линии на картинке, но теперь нужно сохранить эти линии, чтобы открыть их позже. Это мой текущий код для рисования линий:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
pictureBox1.Image = new Bitmap(pictureBox1.Width, pictureBox1.Height);
}
int Drawshape;
private Point p1, p2;
List<Point> p1List = new List<Point>();
List<Point> p2List = new List<Point>();
private void Form1_MouseDown(object sender, MouseEventArgs e)
{
}
private void Form1_Paint(object sender, PaintEventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
Drawshape = 5;
}
private void button2_Click(object sender, EventArgs e)
{
Drawshape = 2;
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (Drawshape == 5)
{
if (p1.X == 0)
{
p1.X = e.X;
p1.Y = e.Y;
}
else
{
p2.X = e.X;
p2.Y = e.Y;
p1List.Add(p1);
p2List.Add(p2);
pictureBox1.Invalidate();
p1.X = 0;
}
}
}
private void pictureBox1_ParentChanged(object sender, EventArgs e)
{
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics G = Graphics.FromImage(pictureBox1.Image);
if (Drawshape == 5)
{
using (var p = new Pen(Color.Blue, 4))
{
for (int x = 0; x < p1List.Count; x++)
{
G.DrawLine(p, p1List[x], p2List[x]);
}
}
}
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
pictureBox1.Invalidate();
}
private void Save_Click(object sender, EventArgs e)
{
}
}
}
Я не знаю, как сохранить эти строки, а также открыть их позже, когда пользователь захочет. Я вставил открытые и сохраненные файловые диалоги, но не уверен, как заставить их делать ту работу, которую я хочу, чтобы они делали. Пожалуйста помоги.
Спасибо
3 ответа
Если вы хотите сохранить изображение, отображаемое в графическом окне, с любыми линиями, которые могли быть нарисованы поверх него во время выполнения, вы можете использовать Control.DrawToBitmap
метод.
Я не могу точно сказать, если вы также спрашиваете, как использовать SaveFileDialog
определить, где пользователь хочет сохранить файл или вы уже разобрались в этой части, но это очень просто.
Вот пример полного решения. Сначала пользователю предлагается диалоговое окно сохранения (озаглавленное "Сохранить изображение" и по умолчанию выполняется фильтрация в растровые изображения (*.bmp)). Если они нажимают кнопку ОК, изображение, отображаемое в графическом окне, обращается во временное растровое изображение, и это временное растровое изображение сохраняется в указанном месте. Если они нажимают кнопку Отмена, файл не сохраняется и метод просто завершается.
private void Save_Click(object sender, EventArgs e)
{
//Show a save dialog to allow the user to specify where to save the image file
using (SaveFileDialog dlgSave = new SaveFileDialog())
{
dlgSave.Title = "Save Image";
dlgSave.Filter = "Bitmap Images (*.bmp)|*.bmp|All Files (*.*)|*.*";
if (dlgSave.ShowDialog(this) == DialogResult.OK)
{
//If user clicked OK, then save the image into the specified file
using (Bitmap bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height))
{
picturebox1.DrawToBitmap(bmp, new Rectangle(0, 0, bmp.Width, bmp.Height));
bmp.Save(dlgSave.FileName);
}
}
}
}
Непонятно, что вы хотите... Вы хотите сохранить получившееся изображение или список точек?
Если вы хотите сохранить изображение, просто используйте pictureBox1.Image.Save(fileName)
,
Если вы хотите сохранить список точек, вы можете использовать сериализацию (она должна работать с двоичной или XML-сериализацией)