Member 12436285 Ответов: 0

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

0 Ответов