Сохранить пользовательскую растровую графику в 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-сериализацией)

Другие вопросы по тегам