Как сделать сохранение нарисованных обьектов(линии, точки и т.д) на picturebox или просто сохранить нарисованные обьекты в виде изображения

вот мой код если надо будет я могу скинуть код классов которые используется

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;


namespace ArtEdit
{
    public partial class ArtEdit : Form
    {
        public ArtEdit()
        {
            InitializeComponent();
            pictureBox1.Paint += pictureBox1_Paint;
            pictureBox1.MouseMove += pictureBox1_MouseMove;
            pictureBox1.MouseUp += PictureBox_MouseUp;
            pictureBox1.MouseDown += PictureBox_MouseDown;
            pictureBox1.MouseWheel += PictureBox1_MouseWheel;
            SetStyle(ControlStyles.ResizeRedraw | ControlStyles.OptimizedDoubleBuffer, true);
            var bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
            pictureBox1.Image = bitmap;
            g = Graphics.FromImage(bitmap);
        }

        #region Varieables
        /*private insert plugin = new insert();*/
        //Int
        private int ClickNum = 1;
        private int DrawIndex = -1;
        //Bool
        private bool active_drawing = false;
        private bool allowSelection = false; // Флаг, разрешающий выделение
        private bool isMouseDown = false;
        //Point
        private Point mouseOffset;
        Point orig;
        //
        Rectangle selRect;
        Pen pen = new Pen(Brushes.Blue, 0.8f) { DashStyle = System.Drawing.Drawing2D.DashStyle.Dash };
        //List
        private List<Entities.Line> lines = new List<Entities.Line>();
        private List<Entities.Point> points = new List<Entities.Point>();
        //Vector
        private Vector firstPoint;
        private Vector currentPosition;
        //
        
        Graphics g;
        #endregion


        #region Открытие
        private void открытьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (OpenFileDialog openFileDialog = new OpenFileDialog())
            {
                openFileDialog.Filter = "Файлы изображений|*.jpg;*.jpeg;*.png;*.bmp;*.gif";
                openFileDialog.Title = "Выберите изображение для открытия";

                if (openFileDialog.ShowDialog() == DialogResult.OK)
                {
                    string selectedFilePath = openFileDialog.FileName;

                    Point pictureBoxLocation = pictureBox1.Location;

                    // Добавляем новый PictureBox
                    PictureBox newPictureBox = new PictureBox();
                    newPictureBox.SizeMode = PictureBoxSizeMode.Zoom; // Изменение размера изображения
                    newPictureBox.Image = Image.FromFile(selectedFilePath);

                    newPictureBox.MouseDown += PictureBox_MouseDown;
                    newPictureBox.MouseMove += pictureBox1_MouseMove;
                    newPictureBox.MouseUp += PictureBox_MouseUp;
                    newPictureBox.Paint += pictureBox1_Paint; // Добавляем обработчик события Paint

                    // Устанавливаем размеры PictureBox в соответствии с размерами формы
                    newPictureBox.Size = pictureBox1.ClientSize;

                    // Устанавливаем положение в верхнем левом углу PictureBox1
                    newPictureBox.Location = pictureBoxLocation;

                    pictureBox1.Controls.Add(newPictureBox);
                    newPictureBox.BringToFront();
                }
            }
        }
        #endregion


        #region Сохранение
        private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)
        {
            using (SaveFileDialog saveFileDialog = new SaveFileDialog())
            {
                saveFileDialog.Title = "Выберите путь сохранения";
                saveFileDialog.Filter = "Формат сохранения|*.png";

                if (saveFileDialog.ShowDialog() == DialogResult.OK)
                {
                    string filename = saveFileDialog.FileName;
                    PictureBox pictureBox = (PictureBox)pictureBox1.Controls[0];
                    MessageBox.Show("Файл сохранен");
                }
                
            }
        }
        #endregion


        #region MouseUp
        void PictureBox_MouseUp(object sender, MouseEventArgs e)
        {

        }
        #endregion


        #region MouseDown
        void PictureBox_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (active_drawing)
                {
                    switch(DrawIndex)
                    {
                        case 0: //точка
                            points.Add(new Entities.Point(currentPosition));
                            pictureBox1.Refresh();
                        break;

                        case 1: //Линия
                            switch (ClickNum)
                            {
                                case 1:
                                    firstPoint = currentPosition;
                                    /*points.Add(new Entities.Point(currentPosition));   отображение начальной точки линии */
                                    ClickNum++;
                                    break;

                                case 2:
                                    lines.Add(new Entities.Line(firstPoint, currentPosition));
                                    /*points.Add(new Entities.Point(currentPosition));            отображения конечной точки линии  */
                                    firstPoint = currentPosition;

                                    break;
                            }
                            break;
                    }
                    pictureBox1.Refresh();
                }
            }
        }
        #endregion


        #region MouseMove
        void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            currentPosition = PointToCartesian(e.Location);
            label1.Text = string.Format("{0}, {1}", e.Location.X, e.Location.Y);
            pictureBox1.Refresh();
        }



        private float DPI
        {
            get
            {
                using (var g = CreateGraphics())
                    return g.DpiX;
            }
        }
        private Vector PointToCartesian(Point point)
        {
            return new Vector(Pixel_To_Mn(point.X), Pixel_To_Mn(pictureBox1.Height - point.Y));
        }
        #endregion


        #region MouseWheel
        private void PictureBox1_MouseWheel(object sender, MouseEventArgs e)
        {
            Point cursorPos = pictureBox1.PointToClient(MousePosition);

            // Вычисляем новый масштаб
            float scaleFactor = e.Delta > 0 ? 1.1f : 0.9f; // Увеличиваем или уменьшаем масштаб

            // Масштабируем изображение в PictureBox
            ScalePictureBoxImage(scaleFactor, cursorPos);
        }
        #endregion


        #region ScalePictureBox
        private void ScalePictureBoxImage(float scaleFactor, Point cursorPos)
        {
            // Получаем текущее изображение в PictureBox
            PictureBox pictureBox = pictureBox1.Controls.Count > 0 ? pictureBox1.Controls[0] as PictureBox : null;
            if (pictureBox != null)
            {
                // Вычисляем новый размер изображения с учетом коэффициента масштабирования
                Size newSize = new Size((int)(pictureBox.Width * scaleFactor), (int)(pictureBox.Height * scaleFactor));

                // Вычисляем смещение координат для сохранения положения курсора при масштабировании
                int dx = (int)((cursorPos.X - pictureBox.Left) * (scaleFactor - 1));
                int dy = (int)((cursorPos.Y - pictureBox.Top) * (scaleFactor - 1));

                // Устанавливаем новые размеры изображения
                pictureBox.Width = newSize.Width;
                pictureBox.Height = newSize.Height;

                // Корректируем положение PictureBox, чтобы сохранить положение курсора
                pictureBox.Left -= dx;
                pictureBox.Top -= dy;

                // Перерисовываем содержимое PictureBox
                pictureBox.Refresh();
            }
        }
        #endregion


        #region Paint on PictureBox
        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(Pens.Black, selRect);

            //Рисование Точек
            e.Graphics.SetParameters(Pixel_To_Mn(pictureBox1.Height));

            if (points.Count > 0)
            {
                foreach (Entities.Point p in points)
                {
                    e.Graphics.DrawPoint(new Pen(Color.Red, 0), p);
                }
            }
            //Рисование Линий
            if (lines.Count > 0)
            {
                foreach (Entities.Line line in lines)
                {
                    e.Graphics.DrawLine(new Pen(Color.Black, 0), line);
                }
            }
            //Рисование Линии улучшенное
            switch (DrawIndex)
            {
                case 1:
                    if (ClickNum == 2)
                    {
                        Entities.Line line = new Entities.Line(firstPoint, currentPosition);
                        e.Graphics.DrawLine(new Pen(Color.Black, 0), line);
                    }
                    break;
            }
        }

        private float Pixel_To_Mn(float pixel)
        {
            return pixel*25.4f/DPI;
        }
        #endregion


        #region Selection Paint
        private void Selection_Paint(object sender, PaintEventArgs e)
        {
            e.Graphics.DrawRectangle(pen, selRect);
        }
        #endregion


        #region Кнопки для рисования
        private void PointBtn_Click(object sender, EventArgs e)
        {
            if (DrawIndex == 0)
            {
                // Если уже рисуется точка, то выходим из режима рисования
                DrawIndex = -1;
                active_drawing = false;
                pictureBox1.Cursor = Cursors.Default;
            }
            else
            {
                // В противном случае, входим в режим рисования точки
                DrawIndex = 0;
                active_drawing = true;
                pictureBox1.Cursor = Cursors.Cross;
            }
        }

        private void LineBtn_Click(object sender, EventArgs e)
        {
            if (DrawIndex == 1)
            {
                // Если уже рисуется линия, то выходим из режима рисования
                DrawIndex = -1;
                active_drawing = false;
                pictureBox1.Cursor = Cursors.Default;
            }
            else
            {
                // В противном случае, входим в режим рисования линии
                DrawIndex = 1;
                active_drawing = true;
                pictureBox1.Cursor = Cursors.Cross;
            }
        }

        #endregion
    }
}

класс GraphicExtenshions

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ArtEdit
    {
        public static class GraphicExtensions
        {
            private static float Height;
            public static void SetParameters(this System.Drawing.Graphics g, float height)
            {   
                Height = height;
            }
    
            public static void SetTransform(this System.Drawing.Graphics g)
            {
                g.PageUnit = System.Drawing.GraphicsUnit.Millimeter;
                g.TranslateTransform(0, Height);
                g.ScaleTransform(1.0f, -1.0f);
            }
    
            public static void DrawPoint(this System.Drawing.Graphics g, System.Drawing.Pen pen, Entities.Point point)
            {
                g.SetTransform();
                System.Drawing.PointF p=point.Position.TopointF;
                g.DrawEllipse(pen, p.X - 1, p.Y - 1, 2, 2);
                g.ResetTransform();
            }
    
            public static void DrawLine(this System.Drawing.Graphics g, System.Drawing.Pen pen,Entities.Line line)
            {
                g.SetTransform();
                g.DrawLine(pen, line.StartPoint.TopointF, line.EndPoint.TopointF);
                g.ResetTransform();
            }
        }
    }


класс Vector

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ArtEdit
    {
        public class Vector
        {
            private double x;
            private double y;
            private double z;
    
            public Vector(double x, double y)
            {
                this.X = x;
                this.Y = y;
                this.Z = 0.0;
            }
    
            public Vector(double x, double y, double z)
                :this(x,y)
            {
                this.Z = z;
            }
    
    
            public double Z
            {
                get { return z; }
                set { z = value; }
            }
    
            public double Y
            {
                get { return y; }
                set { y = value; }
            }
    
            public double X
            {
                get { return x; }
                set { x = value; }
            }
    
            public System.Drawing.PointF TopointF
            {
                get
                {
                    return new System.Drawing.PointF((float)X, (float)Y);
                }
            }
    
            public static Vector Zero
            {
                get {return new Vector(0.0, 0.0, 0.0); }
            }
        }
    }


класс для линии

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ArtEdit.Entities
    {
        public class Line
        {
            private Vector startPoint;
            private Vector endPoint;
            private double tolhina;
    
            public Line()
                : this(Vector.Zero, Vector.Zero)
            {
            }
    
            public Line(Vector start, Vector end)
            {
                this.startPoint = start;
                this.endPoint = end;
                this.Tolhina = 0.0;
            }
    
            public Vector StartPoint
            {
                get { return startPoint; }
                set { startPoint = value; }
            }
    
            public Vector EndPoint
            {
                get { return endPoint; }
                set { endPoint = value; }
            }
            public double Tolhina
            {
                get { return tolhina; }
                set { tolhina = value; }
            }
        }
    }


класс для рисование точки

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ArtEdit.Entities
    {
        public class Point
        {
            private Vector posistion;
            private double tolhina;
    
            public Point()
            {
                this.Position = Vector.Zero;
                this.tolhina = 0.0;
            }
            public Point(Vector posistion) 
            {
                this.Position = posistion;
                this.tolhina = 0.0;
            }
            public double MyProperty
            {
                get { return tolhina; }
                set { tolhina = value; }
            }
            public Vector Position
            {
                get { return posistion; }
                set { posistion = value; }
            }
        }
    }



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