• Viernes 29 de Marzo de 2024, 11:39

Autor Tema:  Seleccionar Trozos De Una Imagen En Un Picturebox  (Leído 5456 veces)

kalixe985

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Seleccionar Trozos De Una Imagen En Un Picturebox
« en: Martes 13 de Noviembre de 2007, 19:22 »
0
Hola!!!

Resulta que estoy haciendo una aplicación en la que se carga una imagen, y en la que debo poder seleccionar trozos de ella, poderlos guardar o poder aplicar operaciones sobre ellos (por ejemplo si hago click con el botón derecho sobre uno, que me aparezaca un menú). Todo lo que es cargar la imagen  y guardar imágenes lo sé hacer (Image.Save(...). También sé hacer que se quede dibujado una especie de rectángulo de selección (al estilo MSPAINT) sobre la imagen del pictureBox (lo hago controlando los eventos MouseMove, MouseUp y MouseDown). El problema viene cuando he dibujado el rectángulo de selección. En lo que necesito ayuda es:
-Que el trozo imagen se quede "marcada" o que se muestre (¿quizá pasándosela a un nuevo PictureBox y que se muestre sobre el original?).

-Me gustaría que poder guardar cada trozo que vaya marcando.

-Después de haber marcado trozos, que pueda aplicar acciones sobre ellos, como que aparezca un menú cuando hago botón derecho o mouseHover, por ejemplo.
-Creo que la clave estaría en saber cómo obtener una imagen nueva, a partir del trozo de la imagen original que quede "seleccionado".




Ya sé que pido mucho, espero que alguien me pueda ayudar. Gracias de antemano y saludos!!!

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Seleccionar Trozos De Una Imagen En Un Picturebox
« Respuesta #1 en: Martes 13 de Noviembre de 2007, 20:43 »
0
Código: Text
  1. El problema viene cuando he dibujado el rectángulo de selección. En lo que necesito ayuda es:
  2. -Que el trozo imagen se quede "marcada" o que se muestre (¿quizá pasándosela a un nuevo PictureBox y que se muestre sobre el original?).
  3.  
  4. -Me gustaría que poder guardar cada trozo que vaya marcando.
  5.  

Utiliza un objeto Bitmap y para recuperar la información de la imagen seleccionada debes convertir el PictureBox.Image a Bitmap desde alli acceder a la información a nivel binario utilizando los métodos de LockBits, asi accededs a los bytes de la imagen y puedes utilizar los bytes que necesites para crear una nueva.

Citar
-Creo que la clave estaría en saber cómo obtener una imagen nueva, a partir del trozo de la imagen original que quede "seleccionado".

Desde el propio objeto Bitmap puedes guardar la nueva imagen
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

kalixe985

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Seleccionar Trozos De Una Imagen En Un Picturebox
« Respuesta #2 en: Jueves 15 de Noviembre de 2007, 22:36 »
0
Hola!!!!
Muchísimas gracias por responder y dedicarle un tiempo al post. Intentaré hacerlo como dice y ya le diré algo.
Infinitas gracias y saludos!!!

kalixe985

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Seleccionar Trozos De Una Imagen En Un Picturebox
« Respuesta #3 en: Lunes 19 de Noviembre de 2007, 13:12 »
0
Hola!!!
He encontrado una forma de hacerlo, en la cual creo un Bitmap a partir del rectángulo de selección y luego creo un pictureBox que carga la imagen y que se muestra encima del pictureBox grande. Pero ahora tengo otro problema, me explico: cuando hago el MouseDown, arrastro y luego MouseUp, se dibuja el rectángulo de selección  y también se dibuja el pictureBox, pero la imagen que me carga sale desplazada. Es como si no cojiera bien las coordenadas del puntero. Yo las coordenadas las calculo respecto del pictureBox con MouseEventArgs, no respecto al formulario. Es por esto que si estoy con el puntero dentro del pictureBox, me marca una coordenadas y si salgo fuera del pictureBox, me marca otras coordenadas totalmente diferentes. ¿Por qué puede ser esto?

A continuación te pongo mi código que dibuja un rectángulo (ver video http://www.megaupload.com/?d=FZHW8Z52), a ver si me puedes ayudar:

        private bool seleccionar = false;
        private Rectangle RectanguloSeleccion = new Rectangle(new Point(0, 0), new Size(0, 0));
        private Point PuntoInicio;
        private Point PuntoFin;
        private int alturaRectanguloSeleccion;
        private int anchoRectanguloSeleccion;
        private float[] valoresLineaDiscontinua ={ 3, 2, 3, 2 };



private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        { this.Click_Raton(e); }



 private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        { this.Levantar_Raton(e); }


 private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        { this.Mover_Raton(e); }



private void Click_Raton(MouseEventArgs e)
{
            if (seleccionar & e.Button == MouseButtons.Left)
            {
                    PuntoInicio = new Point(e.X, e.Y);
            }
 }


private void Levantar_Raton(MouseEventArgs e)
{
            if (seleccionar)
            {
                RectanguloSeleccion = new Rectangle(PuntoInicio.X, PuntoInicio.Y, anchoRectanguloSeleccion, alturaRectanguloSeleccion);
                this.Cursor = System.Windows.Forms.Cursors.Cross;
                Graphics objGrafico = this.pictureBoxPrincipal.CreateGraphics();
                Pen pen = new Pen(Color.Red, 1);
                pen.DashPattern = valoresLineaDiscontinua;
                objGrafico.DrawRectangle(pen, RectanguloSeleccion);
            }
}



 private void Mover_Raton(MouseEventArgs e)
 {
            if (seleccionar & e.Button == MouseButtons.Left)
            {
                PuntoFin = new Point(e.X, e.Y);
                anchoRectanguloSeleccion = PuntoFin.X - PuntoInicio.X;
                alturaRectanguloSeleccion = PuntoFin.Y - PuntoInicio.Y;
            }
 }



Y este el el código de hacerlo ya con pictureBoxes + lo que ya tenía yo, y que dibuja los picturesBoxes, pero con las imágenes desplazadas (ver video http://www.megaupload.com/?d=VPM0VDDX)

private bool seleccionar = false;
        private Rectangle RectanguloSeleccion = new Rectangle(new Point(0, 0), new Size(0, 0));
        private Point PuntoInicio;
        private Point PuntoFin;
        private int alturaRectanguloSeleccion;
        private int anchoRectanguloSeleccion;
        private float[] valoresLineaDiscontinua ={ 3, 2, 3, 2 };

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
        { this.Click_Raton(e); }



 private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
        { this.Levantar_Raton(e); }


 private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        { this.Mover_Raton(e); }


private void Click_Raton(MouseEventArgs e)
{
            if (seleccionar & e.Button == MouseButtons.Left)
            {
                    PuntoInicio = new Point(e.X, e.Y);
            }
 }


private void Levantar_Raton(MouseEventArgs e)
 {
            if (seleccionar)
            {
                RectanguloSeleccion = new Rectangle(PuntoInicio.X, PuntoInicio.Y, anchoRectanguloSeleccion, alturaRectanguloSeleccion);
                Bitmap imagenPequeña = new Bitmap(anchoRectanguloSeleccion, alturaRectanguloSeleccion, this.pictureBoxPrincipal.Image.PixelFormat);
                Rectangle rectDest = new Rectangle(0, 0, anchoRectanguloSeleccion, alturaRectanguloSeleccion);
                Graphics g = Graphics.FromImage(imagenPequeña);
                g.DrawImage(this.pictureBoxPrincipal.Image, rectDest, RectanguloSeleccion2, GraphicsUnit.Pixel);
                g.Dispose();
                PictureBox newPB = new PictureBox();
                newPB.Image = imagenPequeña;
                newPB.BorderStyle = BorderStyle.Fixed3D;
                this.pictureBoxPrincipal.Controls.Add(newPB);
                newPB.Left =  PuntoInicio.X;
                newPB.Top = PuntoInicio.Y;
                newPB.Width = anchoRectanguloSeleccion;
                newPB.Height = alturaRectanguloSeleccion;
                this.Cursor = System.Windows.Forms.Cursors.Cross;
                Graphics objGrafico = this.pictureBoxPrincipal.CreateGraphics();
                Pen pen = new Pen(Color.Red, 1);
                pen.DashPattern = valoresLineaDiscontinua;
                objGrafico.DrawRectangle(pen, RectanguloSeleccion);              
            }
 }


 private void Mover_Raton(MouseEventArgs e)
 {
            if (seleccionar & e.Button == MouseButtons.Left)
            {
                PuntoFin = new Point(e.X, e.Y);
                anchoRectanguloSeleccion = PuntoFin.X - PuntoInicio.X;
                alturaRectanguloSeleccion = PuntoFin.Y - PuntoInicio.Y;
            }
 }


A ver si me puedes echar una mano. Gracias y saludos!!!!

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Seleccionar Trozos De Una Imagen En Un Picturebox
« Respuesta #4 en: Lunes 19 de Noviembre de 2007, 14:32 »
0
Código: Text
  1. [Form | PictureBox].RectangleToClient
  2. [Form | PictureBox].RectangleToScreen
  3.  
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

kalixe985

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Seleccionar Trozos De Una Imagen En Un Picturebox
« Respuesta #5 en: Lunes 19 de Noviembre de 2007, 23:43 »
0
Cita de: "JuanK"
Código: Text
  1. [Form | PictureBox].RectangleToClient
  2. [Form | PictureBox].RectangleToScreen
  3.  
Hola!!!
Primero que todo, muchas gracias por responder!!!
Me he estado mirando lo de Control.RectangleToClient , Control.RectangleToScreen y ControlPaint.DrawReversibleFrame en la msdn, pero no lo acabo de tener claro. A ver si me puede ayudar con:

-¿Qué son coordenadas de cliente y qué son coordenadas de pantalla?
-¿Qué es un rectángulo de cliente y qué uno de pantalla?
-¿Cómo podría aplicar esto a mi código para que, al dibujar los rectángulos de selección, se dibujaran bien los pictureBoxes y las imágenes?



A ver si me puede echar una ayudita, salu2!!!!!!!!!

JuanK

  • Miembro de ORO
  • ******
  • Mensajes: 5393
  • Nacionalidad: co
    • Ver Perfil
    • http://juank.io
Re: Seleccionar Trozos De Una Imagen En Un Picturebox
« Respuesta #6 en: Martes 20 de Noviembre de 2007, 01:17 »
0
Es muy sencillo, has pruebas.

3so es onvertir el rectangulo a las coordenadas de la forma y no a las de la pantalla y viceversa.

en la pantalla puede iniciar en 1,100 pero en la forma la posicion es 10,5....  :comp:
[size=109]Juan Carlos Ruiz Pacheco
[/size]
Microsoft Technical Evangelist
@JuanKRuiz
http://juank.io

kalixe985

  • Miembro activo
  • **
  • Mensajes: 33
    • Ver Perfil
Re: Seleccionar Trozos De Una Imagen En Un Picturebox
« Respuesta #7 en: Jueves 22 de Noviembre de 2007, 01:33 »
0
Hola!!!

Al final lo he intentado de 20000 formas diferentes, y me sigue pasando básicamente lo mismo, la imagen que me pone en el pictureBox es de una zona diferente a la que yo he seleccionado. Intenté con lo de RectangleToClient, pero sólo me sirvió en parte. Ahora mismo, lo estoy intentando hacer sobre un pictureBox, que está dentro de una tabPage, estos dentro de un formulario. Adjunto el código y un video para que vea lo que me sucede a ver si me puede ayudar: http://www.megaupload.com/?d=IN3T0YC0 o http://rapidshare.com/files/71384291/video.rar.html    (660KB)


Código: Text
  1. private bool seleccionar = false;
  2. private Rectangle RectanguloSeleccion;
  3. private Point PuntoInicio;
  4. private Point PuntoFin;
  5. private int anchoSeleccion;
  6. private int alturaSeleccion;
  7.  
  8.  
  9.  
  10.  
  11.  private void MouseDown_PictureBox(object sender, MouseEventArgs e)
  12. { this.Click_Raton(sender,e);
  13. }
  14.  
  15.  
  16.  
  17. private void MouseUp_PictureBox(object sender, MouseEventArgs e)
  18. { this.Levantar_Raton(sender,e);
  19. }
  20.  
  21.  
  22.  
  23. private void MouseMove_PictureBox(object sender, MouseEventArgs e)
  24. { this.Mover_Raton(sender,e);
  25. }
  26.  
  27.  
  28.  
  29. private void Click_Raton(object sender,MouseEventArgs e)
  30. {
  31.             if (e.Button == MouseButtons.Left)
  32.             {
  33.                 seleccionar = true;
  34.             }
  35.             Control control = (Control)sender;
  36.             PuntoInicio = control.PointToScreen(new Point(e.X, e.Y));
  37. }
  38.  
  39.  
  40.  
  41.  
  42. private void Mover_Raton(object sender,MouseEventArgs e)
  43. {
  44.             if (seleccionar)
  45.             {
  46.                 ControlPaint.DrawReversibleFrame(RectanguloSeleccion,Color.Silver, FrameStyle.Dashed);
  47.                 PuntoFin = ((Control)sender).PointToScreen(new Point(e.X, e.Y));
  48.                 anchoSeleccion = PuntoFin.X - PuntoInicio.X;
  49.                 alturaSeleccion = PuntoFin.Y - PuntoInicio.Y;
  50.                 RectanguloSeleccion = new Rectangle(PuntoInicio.X, PuntoInicio.Y, anchoSeleccion, alturaSeleccion);
  51.                 ControlPaint.DrawReversibleFrame(RectanguloSeleccion,Color.Silver, FrameStyle.Dashed);
  52.             }
  53.  
  54. }
  55.  
  56.  
  57.  
  58. private void Levantar_Raton(object sender, MouseEventArgs e)
  59. {
  60.             seleccionar = false;
  61.             ControlPaint.DrawReversibleFrame(RectanguloSeleccion,Color.Blue, FrameStyle.Thick);
  62.             Rectangle r1 = this.pictureBoxPrincipal.RectangleToClient(RectanguloSeleccion);
  63.             Bitmap imagenPequeña = new Bitmap(anchoSeleccion, alturaSeleccion, this.pictureBoxPrincipal.Image.PixelFormat);
  64.             Rectangle rectDest = new Rectangle(0, 0, anchoSeleccion, alturaSeleccion);
  65.             Graphics g = Graphics.FromImage(imagenPequeña);
  66.             g.DrawImage(this.pictureBoxPrincipal.Image, rectDest, r1, GraphicsUnit.Pixel);
  67.             g.Dispose();
  68.             PictureBox newPB = new PictureBox();
  69.             newPB.Image = imagenPequeña;
  70.             newPB.BorderStyle = BorderStyle.Fixed3D;
  71.             this.pictureBoxPrincipal.Controls.Add(newPB);
  72.             newPB.Location = new System.Drawing.Point(r1.X, r1.Y);
  73.             newPB.Size = new System.Drawing.Size(anchoSeleccion, alturaSeleccion);
  74.             newPB.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Normal;
  75. }
  76.  




Espero que me pueda ayudar. Gracias y saludos!!!!

MrBonham

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Seleccionar Trozos De Una Imagen En Un Picturebox
« Respuesta #8 en: Jueves 10 de Diciembre de 2009, 19:50 »
0
A ver si alguien me puede ayudar, creo que mi problema tiene algo que ver....

El caso es que yo quiero dibujar un rectángulo de selección sobre la imagen, hasta ahí todo en orden, pero lo siguiente que me gustaría poder hacer, es, en ejecución, poder seleccionar ese rectángulo con el puntero y arrastrarlo hasta la zona de la imagen que considere apropiada. Es decir, poder mover el rectángulo, haciendo el mismo un elemento activo sobre la imagen.

¿Alguien sabe si es posible?