Как сделать сохранение нарисованных обьектов(линии, точки и т.д) на 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; }
}
}
}