Foros del Web » Programación para mayores de 30 ;) » .NET »

Seleccionar trozos de ina imagen en eun PictureBox y poderlos guardar y dejar marcad

Estas en el tema de Seleccionar trozos de ina imagen en eun PictureBox y poderlos guardar y dejar marcad en el foro de .NET en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 13/11/2007, 12:23
Avatar de kalixe985  
Fecha de Ingreso: junio-2006
Ubicación: Colombiano viviendo en Es
Mensajes: 73
Antigüedad: 17 años, 10 meses
Puntos: 0
Pregunta Seleccionar trozos de ina imagen en eun PictureBox y poderlos guardar y dejar marcad

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!!!
  #2 (permalink)  
Antiguo 19/11/2007, 06:10
Avatar de kalixe985  
Fecha de Ingreso: junio-2006
Ubicación: Colombiano viviendo en Es
Mensajes: 73
Antigüedad: 17 años, 10 meses
Puntos: 0
Pregunta Re: Seleccionar trozos de ina imagen en eun PictureBox y poderlos guardar y dejar mar

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:

Código:
        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):
Código:
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 alguien me puede echar una mano. Gracias y saludos!!!!
  #3 (permalink)  
Antiguo 21/11/2007, 18:41
Avatar de kalixe985  
Fecha de Ingreso: junio-2006
Ubicación: Colombiano viviendo en Es
Mensajes: 73
Antigüedad: 17 años, 10 meses
Puntos: 0
Pregunta Re: Seleccionar trozos de ina imagen en eun PictureBox y poderlos guardar y dejar mar

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 a ver alguien si me puede ayudar: http://www.megaupload.com/?d=IN3T0YC0 o http://rapidshare.com/files/71384291/video.rar.html (660KB)


Código:
private bool seleccionar = false;
private Rectangle RectanguloSeleccion;
private Point PuntoInicio;
private Point PuntoFin;
private int anchoSeleccion;
private int alturaSeleccion;




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



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



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



private void Click_Raton(object sender,MouseEventArgs e)
{
            if (e.Button == MouseButtons.Left)
            {
                seleccionar = true;
            }
            Control control = (Control)sender;
            PuntoInicio = control.PointToScreen(new Point(e.X, e.Y));
}




private void Mover_Raton(object sender,MouseEventArgs e)
{
            if (seleccionar)
            {
                ControlPaint.DrawReversibleFrame(RectanguloSeleccion,Color.Silver, FrameStyle.Dashed);
                PuntoFin = ((Control)sender).PointToScreen(new Point(e.X, e.Y));
                anchoSeleccion = PuntoFin.X - PuntoInicio.X;
                alturaSeleccion = PuntoFin.Y - PuntoInicio.Y;
                RectanguloSeleccion = new Rectangle(PuntoInicio.X, PuntoInicio.Y, anchoSeleccion, alturaSeleccion);
                ControlPaint.DrawReversibleFrame(RectanguloSeleccion,Color.Silver, FrameStyle.Dashed);
            }

}



private void Levantar_Raton(object sender, MouseEventArgs e)
{
            seleccionar = false;
            ControlPaint.DrawReversibleFrame(RectanguloSeleccion,Color.Blue, FrameStyle.Thick);
            Rectangle r1 = this.pictureBoxPrincipal.RectangleToClient(RectanguloSeleccion);
            Bitmap imagenPequeña = new Bitmap(anchoSeleccion, alturaSeleccion, this.pictureBoxPrincipal.Image.PixelFormat);
            Rectangle rectDest = new Rectangle(0, 0, anchoSeleccion, alturaSeleccion);
            Graphics g = Graphics.FromImage(imagenPequeña);
            g.DrawImage(this.pictureBoxPrincipal.Image, rectDest, r1, GraphicsUnit.Pixel);
            g.Dispose();
            PictureBox newPB = new PictureBox();
            newPB.Image = imagenPequeña;
            newPB.BorderStyle = BorderStyle.Fixed3D;
            this.pictureBoxPrincipal.Controls.Add(newPB);
            newPB.Location = new System.Drawing.Point(r1.X, r1.Y);
            newPB.Size = new System.Drawing.Size(anchoSeleccion, alturaSeleccion);
            newPB.SizeMode = System.Windows.Forms.PictureBoxSizeMode.Normal;
}



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

Última edición por kalixe985; 21/11/2007 a las 19:16
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:14.