• Jueves 28 de Marzo de 2024, 11:02

Autor Tema:  Duda con clases PictureBox y Graphics  (Leído 3604 veces)

shacklebolt

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Duda con clases PictureBox y Graphics
« en: Jueves 29 de Abril de 2010, 12:44 »
0
Hola!! Mi problema es el siguiente.

En mi aplicación tengo que cargar una imagen .jpg y lo hago cargando la imagen desde una ruta en un objeto "pictureBox1" de esta manera calcando un botón:
Código: C#
  1. private void button1_Click(object sender, EventArgs e)
  2.         {
  3.             try
  4.             {
  5.                 pictureBox1.Image = Image.FromFile(textBox1.Text);
  6.                 pictureBox1.SizeMode = PictureBoxSizeMode.AutoSize;
  7.             }
  8.             catch (Exception exc)
  9.             {
  10.                 textBox1.Text = exc.Message;
  11.             }
  12.         }
  13.  

Y luego tengo un evento que cuando salta debo dibujar un rectangulo azul con unas coordenadas "x" e "y" calculadas previamente. El rectángulo debe superponerse a la imagen anteriormente cargada.

Código: C#
  1. Pen myPen = new Pen(Color.Blue);
  2.                 pictureBox1.CreateGraphics().DrawRectangle(myPen, x, y, 5, 5);
  3.  

El caso es que ese evento se produce cada poco y entonces se crea un nuevo rectángulo.

Mi intención es que si tengo que dibujar un nuevo rectángulo en la imagen quiero que se elimine el anterior ya que si no se va llenando la imagen de rectangulos.

He probado haciendo con :

Código: C#
  1.  
  2. pictureBox1.CreateGraphics().Clear(Color.Transparent);
  3. Pen myPen = new Pen(Color.Blue);
  4.                 pictureBox1.CreateGraphics().DrawRectangle(myPen, x, y, 5, 5);
  5.  

pero entonces se me elimina la imagen cargada aunque luego si es cierto que va dibujando los rectangulos uno a uno.

También probé a cargar la imagen de nuevo cada vez que realizaba el método Clear() de esta manera:

Código: C#
  1.  
  2. pictureBox1.CreateGraphics().Clear(Color.Transparent);
  3. pictureBox1.Image = Image.FromFile(textBox1.Text);
  4. Pen myPen = new Pen(Color.Blue);
  5.                 pictureBox1.CreateGraphics().DrawRectangle(myPen, x, y, 5, 5);
  6.  

pero me daba un excepción en tiempo de ejecución de que no se podia hacer referencia a pictureBox1 en un subproceso diferente.

En conclusión, quisiera encontrar la manera de ir dibujando los rectángulos: dibujo 1º rec, dibujo 2º rec, borro 1º rec, dibujo 3º rec, borro 2º rec, etc.

Me sería de gran ayuda cualquier comentario. Gracias!!

Jeysscarr

  • Miembro MUY activo
  • ***
  • Mensajes: 134
  • Nacionalidad: co
    • Ver Perfil
Re: Duda con clases PictureBox y Graphics
« Respuesta #1 en: Jueves 29 de Abril de 2010, 15:43 »
0
En este ejemplo tengo una variable statica valida a nivel de la clase de tipo IMAGE llamada "im", al principio cargo una determinada imagen y cuando hago click en un boton este cambia la imagen, las dimensiones del picturebox que en este caso es P1 y dibuja el rectangulo....

EN principio como voy a dibujar YO MISMO, prescindi de usar propiedades como Sizemode y controle la situacion con los PhysicalDimension de la imagen
Lo unico que hago es establecer un nuevo valor del objeto IMAGE e invoco al metodo REFRESH() del picture para ver los cambios.

Código: C#
  1. static Image im;
  2.  
  3.         private void button1_Click(object sender, EventArgs e)
  4.         {
  5.  
  6.             im = Image.FromFile("C:\Res2.png");
  7.  
  8.             P1.Width = (int)im.PhysicalDimension.Width;
  9.             P1.Height = (int)im.PhysicalDimension.Height;
  10.  
  11.  
  12.             P1.Refresh();
  13.         }
  14.  
  15.         private void P1_Paint(object sender, PaintEventArgs e)
  16.         {
  17.  
  18.             e.Graphics.Clear(Color.Transparent);
  19.  
  20.            
  21.             Pen myPen = new Pen(Color.Blue);
  22.             e.Graphics.DrawImageUnscaled(im,new Point (0,0));
  23.             e.Graphics.DrawRectangle(myPen, 0, 0, 20, 20);
  24.         }
  25.  
  26.         private void Form1_Load(object sender, EventArgs e)
  27.         {
  28.             im = Image.FromFile("C:\resultados1.jpg");
  29.             P1.Width = (int)im.PhysicalDimension.Width;
  30.             P1.Height = (int)im.PhysicalDimension.Height;
  31.         }
  32.  

El problema que te dice del subproceso diferente es porque el evento paint se procesa en un hilo distinto, es un evento que esta siempre en marcha, cuando agregas la asignacion de la imagen estas llamando a una propiead que originalmente se encuentra en el proceso principal de la aplicacion y no en el que esta "Bajo bambalinas", lo que hace que te genere esta excepcion, igual CREO que pordria solucionarse usando esto en el form_load..---> CheckForIllegalCrossThreadCalls = false;
Nuestro poder está creciendo mas rápido que nuestra sabiduria

shacklebolt

  • Nuevo Miembro
  • *
  • Mensajes: 6
    • Ver Perfil
Re: Duda con clases PictureBox y Graphics
« Respuesta #2 en: Jueves 29 de Abril de 2010, 16:38 »
0
Pues muchisimas gracias por la contestación.

Está todo perfecto, el método que me salvó fue "e.Graphics.DrawImageUnscaled(im,new Point (0,0));" no me había dado cuenta de él.

Como es una aplicación en tiempo real no me valía únicamente con redibujar el nuevo rectangulo y la imagen en el método Paint asi que tuve que duplicar el código directamente cuando recibia unas nuevas coordenadas para dibujar el rectangulo:


Código: C#
  1.  
  2.                 pictureBox1.CreateGraphics().Clear(Color.Transparent);
  3.  
  4.                 Pen myPen = new Pen(Color.Blue);
  5.                 pictureBox1.CreateGraphics().DrawImageUnscaled(im, new Point(0, 0));
  6.                 pictureBox1.CreateGraphics().DrawRectangle(myPen, x, y, 3, 3);
  7.  
  8.  

Y luego el evento Paint del picturebox:

Código: C#
  1.  
  2.         private void pictureBox1_Paint(object sender, PaintEventArgs e)
  3.         {
  4.                 e.Graphics.Clear(Color.Transparent);
  5.  
  6.                 Pen myPen = new Pen(Color.Blue);
  7.                 e.Graphics.DrawImageUnscaled(im, new Point(0, 0));
  8.                 e.Graphics.DrawRectangle(myPen, x, y, 3, 3);
  9.         }
  10.  
  11.  

El único inconveniente son los pantallazos que se producen al redibujar la imagen pero como los datos del nuevo rectangulo se producen cada cierto tiempo pues no se nota mucho jeje.

Gracias de nuevo y un saludo

Jeysscarr

  • Miembro MUY activo
  • ***
  • Mensajes: 134
  • Nacionalidad: co
    • Ver Perfil
Re: Duda con clases PictureBox y Graphics
« Respuesta #3 en: Jueves 29 de Abril de 2010, 17:07 »
0
para quitar los pantallazos usa una propiedad llamada DOUBLEBUFFERED del formulario y ponla a TRUE... esto le dice a la aplicación que el formulario actual será usado para operaciones de dibujo personalizadas del cliente por lo cual le brinda mas atencion y mas velocidad de actualizacion a los eventos paint...
Nuestro poder está creciendo mas rápido que nuestra sabiduria