Está en la página 1de 7

26/ 11/ 12

C shar p - Sel cci nar t r ozos de una i agen en un Pi t ur eBox e o m c

Comunidad de Programadores

Correo

Contrasea

Recordar contrasea en este nav egador

LWP >> Foros >> C sharp >> Seleccionar trozos de una imagen en un PictureBox

Lunes, 26 de noviembre de 2012

Anuncios Google
Informacin Cursos y Manuales Biblioteca de Temas Cdigo Fuente Diccionario Noticias/Artculos Encuestas/Estadsticas Servicios Foros de Consulta Preguntas/Respuestas Tabln de Notas Iconos y Cursores Programadores Programadores Ofertas de Trabajo Lista de Correo Programas Programas/Utilidades Nuestros Programas Solicitudes Buscar Buscador para Prog. Direcciones Inters Otros Mercadillo Chat Colaboradores Contactar

C#

C# VB Net ASP

Curso De C#

C# Image Bitmap

C sharp - Seleccionar trozos de una imagen en un PictureBox

<< >> Filtrado por todos los mensajes Seleccionar trozos de una imagen en un PictureBox kalixe985 (13/11/2007 18:39:21) RE:Seleccionar trozos de una imagen en un PictureB El Dr. Gusman (15/11/2007 17:46:55) RE:Seleccionar trozos de una imagen en un PictureB kalixe985 (15/11/2007 21:41:40) RE:Seleccionar trozos de una imagen en un PictureB kalixe985 (19/11/2007 12:18:07) RE:NUEVO: Seleccionar trozos de una imagen .... kalixe985 (22/11/2007 00:54:33) Vistas: arbol 3.822 visitas 4 respuestas

0
Hola!!!

Asunto: Seleccionar trozos de una imagen en un PictureBox Autor: kalixe985 (26 intervenciones) Fecha: 13/11/2007 18:39:21

Resulta que estoy haciendo una aplicacin 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 botn derecho sobre uno, que me aparezaca un men). Todo lo que es cargar la imagen y guardar imgenes lo s hacer (Image.Save(...). Tambin s hacer que se quede dibujado una especie de rectngulo de seleccin (al estilo MSPAINT) sobre la imagen del pictureBox (lo hago controlando los eventos MouseMove, MouseUp y MouseDown). El problema viene cuando he dibujado el rectngulo de seleccin. En lo que necesito ayuda es: -Que el trozo imagen se quede "marcada" o que se muestre (quiz pasndosela a un nuevo PictureBox y que se muestre sobre el original?).
a ebdel r ogr am ador . com / / 900355- Sel cci nar _t r ozos_de_una_i agen_en_un_Pi t ur eBox. ht m l lw p e o m c 1/ 7

26/ 11/ 12

C shar p - Sel cci nar t r ozos de una i agen en un Pi t ur eBox e o m c

se muestre sobre el original?). -Me gustara que poder guardar cada trozo que vaya marcando. -Despus de haber marcado trozos, que pueda aplicar acciones sobre ellos, como que aparezca un men cuando hago botn derecho o mouseHover, por ejemplo. -Creo que la clave estara en saber cmo 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!!!

Tambin te puede interesar... - Cursos de C sharp - Temas de C sharp - Cdigo fuente de C sharp

0
Buenas.

Asunto: Autor: Fecha: Url:

RE:Seleccionar trozos de una imagen en un PictureB El Dr. Gusman (2 intervenciones) 15/11/2007 17:46:55 http://www.drgusman.info

Para conseguir lo que quieres tienes varios mtodos. El mas sencillo tal y como tu has dicho es crear otro picturebox encima del original y copiar el trozo a un nuevo bitmap y asignar este bitmap como imagen al nuevo picturebox. Para conseguir esto haz lo siguiente: -Almacena las coordenadas del rectngulo dentro de la imagen original. -Crea un Bitmap utilizando el tamao del recuadro y usando el formato de imagen de la imagen original. Suponiendo que tu picturebox original se llamase pb1 y que las dimensiones del recuadro seleccionado se hubiesen guardado como Width y Height el cdigo sera: Bitmap newBMP = new Bitmap(Width, Height, pb1.Image.PixelFormat); -Ahora que tienes la nueva imagen de destino, obtienes un objeto Graphics del nuevo Bitmap y dibujas el rectangulo seleccionado. Como tienes las coordenadas X e Y del rectngulo y el alto y el ancho aprovechamos para crear un Rectangle con dichas propiedades. Vamos a llamar X e Y a las coordenadas y Width y Height a los tamaos, quedando este cdigo: Rectangle rectSrc = new Rectangle(X, Y, Width, Height); //Recuadro de origen Rectangle rectDest = new Rectangle(0, 0, Width, Height); //Recuadro de destino Graphics g = Graphics.FromImage(newBMP); g.DrawImage(pb1.Image, rectDest, rectSrc, GraphicsUnit.Pixel); g.Dispose(); -Ya tenemos la imagen, ahora hay que crear el nuevo PictureBox y aadirlo dentro del PictureBox original: PictureBox newPB = new PictureBox(); newPB.Image = newBMP; newPB.BorderStyle = BorderStyle.None; pb1.Controls.Add(newPB); newPB.Left = X; newPB.Top = Y; newPB.Width = Width; newPB.Height = Height; -En este punto ya tienes el nuevo picturebox, dentro del original, y con el trozo de imagen cargado. Si ahora quieres disparar eventos (por ejemplo el Click) solo has de engancharte a ellos (ah, de paso metemos en el tag una ID nica para poder identificar el picturebox que dispara el evento): newPB.Tag = VariableDeID; //El Tag es un object, as que puedes //poner el tipo de variable que quieras
a ebdel r ogr am ador . com / / 900355- Sel cci nar _t r ozos_de_una_i agen_en_un_Pi t ur eBox. ht m l lw p e o m c 2/ 7

26/ 11/ 12

C shar p - Sel cci nar t r ozos de una i agen en un Pi t ur eBox e o m c

//poner el tipo de variable que quieras newPB.Click += new EventHandler(recuadros_Click); Creo que con esto ya tienes lo que buscabas, una cosa que si te debo recordar es que si quieres destruir los pictureboxes primero los debes de eliminar de la coleccin Controls del picturebox original antes de hacer el dispose si no quieres generar una excepcin. Otra cosa que te recomendara es que te crees un List<T> o un Dictionary<TKey, TValue> con los pictureboxes para poder acceder a ellos facilmente. Bueno, pues eso es todo, como te he dicho hay mas mtodos de hacer esto (podrias hacerlo con un solo picturebox, creando controles sin ventana que capten los clicks dentro de otro control dentro de un rea definida (tienes un ejemplo de esto en mi web: http://www.drgusman.info) y guardando los Bitmaps de los trozos en una lista y redibujndolos segn te haga falta) pero este es el ms sencillo. Espero haberte sido de ayuda. Un saludo. El Dr. Gusman.

Asunto: RE:Seleccionar trozos de una imagen en un PictureB Autor: kalixe985 (26 intervenciones) Fecha: 15/11/2007 21:41:40

Hola!!!! Muchsimas gracias por responder y dedicarle un buen tiempo al post. Intentar hacerlo como dices y ya te dir algo. Infinitas gracias y saludos!!!

Asunto: RE:Seleccionar trozos de una imagen en un PictureB Autor: kalixe985 (26 intervenciones) Fecha: 19/11/2007 12:18:07

Hola!!! He intentado hacerlo como me has dicho y me ha funcionado a medias. Me explico: cuando hago el MouseDown, arrastro y luego MouseUp, se dibuja el rectngulo de seleccin y tambin 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. Sabes por qu puede ser esto? A continuacin te pongo mi cdigo que dibuja un rectngulo (ver 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); }
a ebdel r ogr am ador . com / / 900355- Sel cci nar _t r ozos_de_una_i agen_en_un_Pi t ur eBox. ht m l lw p e o m c 3/ 7

26/ 11/ 12

C shar p - Sel cci nar t r ozos de una i agen en un Pi t ur eBox e o m c

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 cdigo de mezclar lo que tu me dijiste con lo que yo tena, y que dibuja los picturesBoxes, pero con las imgenes desplazadas (ver 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,
a ebdel r ogr am ador . com / / 900355- Sel cci nar _t r ozos_de_una_i agen_en_un_Pi t ur eBox. ht m l lw p e o m c 4/ 7

26/ 11/ 12

C shar p - Sel cci nar t r ozos de una i agen en un Pi t ur eBox e o m c

RectanguloSeleccion = new Rectangle(PuntoInicio.X, PuntoInicio.Y, anchoRectanguloSeleccion, alturaRectanguloSeleccion); Bitmap imagenPequea = new Bitmap(anchoRectanguloSeleccion, alturaRectanguloSeleccion, this.pictureBoxPrincipal.Image.PixelFormat); Rectangle rectDest = new Rectangle(0, 0, anchoRectanguloSeleccion, alturaRectanguloSeleccion); Graphics g = Graphics.FromImage(imagenPequea); g.DrawImage(this.pictureBoxPrincipal.Image, rectDest, RectanguloSeleccion2, GraphicsUnit.Pixel); g.Dispose(); PictureBox newPB = new PictureBox(); newPB.Image = imagenPequea; 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. He mirado tu web, pero no encontr el ejemplo que decas de la otra forma de hacerlo. Gracias y saludos!!!!

0
Hola!!!

Asunto: RE:NUEVO: Seleccionar trozos de una imagen .... Autor: kalixe985 (26 intervenciones) Fecha: 22/11/2007 00:54:33

Al final lo he intentado de 20000 formas diferentes, y me sigue pasando bsicamente 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 slo 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 cdigo y un video a ver alguien si me puede ayudar: http://www.megaupload.com/?d=IN3T0YC0 (660KB) 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)


a ebdel r ogr am ador . com / / 900355- Sel cci nar _t r ozos_de_una_i agen_en_un_Pi t ur eBox. ht m l lw p e o m c 5/ 7

26/ 11/ 12

C shar p - Sel cci nar t r ozos de una i agen en un Pi t ur eBox e o m c

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 imagenPequea = new Bitmap(anchoSeleccion, alturaSeleccion, this.pictureBoxPrincipal.Image.PixelFormat); Rectangle rectDest = new Rectangle(0, 0, anchoSeleccion, alturaSeleccion); Graphics g = Graphics.FromImage(imagenPequea); g.DrawImage(this.pictureBoxPrincipal.Image, rectDest, r1, GraphicsUnit.Pixel); g.Dispose(); PictureBox newPB = new PictureBox(); newPB.Image = imagenPequea; 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!!!!

Escribir en textBox multilnea

comunicacion OPC en C#

GdPicture.NET Imaging SDK


a ebdel r ogr am ador . com / / 900355- Sel cci nar _t r ozos_de_una_i agen_en_un_Pi t ur eBox. ht m l lw p e o m c 6/ 7

26/ 11/ 12

C shar p - Sel cci nar t r ozos de una i agen en un Pi t ur eBox e o m c

GdPicture.NET Imaging SDK


scan, view, create, edit, convert print, enhance, OCR for vb.net & c#
www.GdPicture.com

Copyright 2000-2012 Interactive Programmers Community - Todos los derechos reservados

a ebdel r ogr am ador . com / / 900355- Sel cci nar _t r ozos_de_una_i agen_en_un_Pi t ur eBox. ht m l lw p e o m c

7/ 7

También podría gustarte