Picturebox увеличивайте/уменьшайте масштаб, вращайте вместе с линиями рисования
У меня есть работа с редактором imagen, в котором загружается изображение и пробуется сделать увеличение/уменьшение масштаба вместе с рисованием линий.
- В момент масштабирования линии не могут изменять размер линий, только не могут масштабировать графику, а координаты не вращаются.
- Для поворота не могу изменить размер линий, только могу повернуть графику, координаты не вращаются.
кто-нибудь может мне помочь!! спасибо.
Для того чтобы нарисовать линию на картинке:
private void image_Paint(object sender, PaintEventArgs e) { int bDos, dDos, aDos, cDos; ; double puntoADos, puntoBDos, zDos, mmDos, resultDos; e.Graphics.ScaleTransform(1.06F, 1.06F); if (linea.BackColor == Color.FromArgb(255, 0, 0) || girar.BackColor == Color.FromArgb(255, 0, 0) || mover.BackColor == Color.FromArgb(255, 0, 0) || zoom.BackColor == Color.FromArgb(255, 0, 0) || zoomOut.BackColor == Color.FromArgb(255, 0, 0)) { // Dibuja los segmentos. for (int i = 0; i < Pt1.Count; i++) { // Dibuja el segmento. //Pen greenPen = new Pen(Color.FromArgb(255, 0, 255, 0), 5); Pen greenPen = new Pen(Colores.BackColor); e.Graphics.DrawLine(greenPen, Pt1[i], Pt2[i]); } int Talvez = 0; // Dibuja el final de los puntos. foreach (Point pt in Pt1) { Rectangle rect = new Rectangle(pt.X - object_radius, pt.Y - object_radius, 2 * object_radius + 1, 2 * object_radius + 1); //Color de fondo del punto de inicio de la linea. e.Graphics.FillEllipse(Brushes.Red, rect); //Color de contorno del punto de inicio. e.Graphics.DrawEllipse(Pens.Red, rect); aDos = pt.X; cDos = pt.Y; Point ptFinal = Pt2[Talvez]; // pt. Rectangle RectFinal = new Rectangle(ptFinal.X - object_radius, ptFinal.Y - object_radius, 2 * object_radius + 1, 2 * object_radius + 1); // //Color del punto final de la linea. e.Graphics.FillEllipse(Brushes.Red, RectFinal); //Color del contorno del circulo del punto final. e.Graphics.DrawEllipse(Pens.Red, RectFinal); bDos = ptFinal.X; dDos = ptFinal.Y; puntoADos = Math.Pow(bDos - aDos, 2); puntoBDos = Math.Pow(dDos - cDos, 2); zDos = Math.Sqrt(puntoADos + puntoBDos); mmDos = zDos / 3.779527559; resultDos = Math.Round(mmDos, 2); /////////////// MOSTRAMOS LA CAJA DE TEXTO AL FINAL DE LA LINEA ///////////////////////// string drawString = Convert.ToString(resultDos); Font drawFont = new Font("Arial", 8); ///// Creamos el color del rectangulo al final de la linea /////////// SolidBrush myBrush = new SolidBrush(Color.FromArgb(100, 245, 171, 0)); e.Graphics.FillRectangle(myBrush, new Rectangle(ptFinal.X + 5, ptFinal.Y + 2, 60, 20)); ///////////// Definimos el color del texto del resultado ///////// SolidBrush drawBrush = new SolidBrush(Color.Yellow); e.Graphics.DrawString(" " + drawString + " mm", drawFont, drawBrush, ptFinal.X + 5, ptFinal.Y + 5); Talvez++; e.Graphics.Transform = MyMatrix; } // Muestra la construccion de la linea. if (IsDrawing) { //Color de linea al momento de trazarla. Pen greenPen = new Pen(Colores.BackColor); e.Graphics.DrawLine(greenPen, NewPt1, NewPt2); e.Graphics.SmoothingMode = SmoothingMode.HighQuality; e.Graphics.InterpolationMode = InterpolationMode.HighQualityBicubic; e.Graphics.PixelOffsetMode = PixelOffsetMode.HighQuality; } /* // Ubicación de la basura. RectangleF trash_rect = new RectangleF(50, 50, TrashWidth, TrashHeight); e.Graphics.DrawImage( Properties.Resources.basura, trash_rect);*/ } }
Для изменения курсора для рисования или перемещения pictureBox:
// Inicia el dibujado de la linea. private void image_MouseMove(object sender, MouseEventArgs e) { if (linea.BackColor == Color.FromArgb(255, 0, 0) || zoom.BackColor == Color.FromArgb(255, 0, 0)) { Cursor new_cursor = Cursors.Cross; // Verificamos que tipo de cursor se encuentra por encima del picturebox Point hit_point; int segment_number; if (MouseIsOverEndpoint(e.Location, out segment_number, out hit_point)) { new_cursor = Cursors.Hand; } else if (MouseIsOverSegment(e.Location, out segment_number)) { new_cursor = Cursors.Hand; } //Cambia de cursor. if (image.Cursor != new_cursor) image.Cursor = new_cursor; image.Refresh(); } if (mover.BackColor == Color.FromArgb(255, 0, 0)) { if (e.Button == MouseButtons.Left) { panel1.Location = new Point(panel1.Left + e.X - izquierdo, panel1.Top + e.Y - alto); } } }
Что я уже пробовал:
- Можно сделать увеличение/уменьшение масштаба в picturebox с изображением.Размер = новый размер (изображение.Ширина + 50, изображение.Высота + 50).
- Для масштабирования графики занимают e. graphics.ScaledTransform(1.06 F, 1.06 F);
- это ссылка где это приложение https://1drv.ms/f/s! Arkknjaihkshfaoixcexzw3ilaf