Domingo 22 de Diciembre de 2024, 15:51
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
CLR: .Net / Mono / Boo / Otros CLR
»
C#
(Moderador:
ProfesorX
) »
Duda con clases PictureBox y Graphics
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Duda con clases PictureBox y Graphics (Leído 3759 veces)
shacklebolt
Nuevo Miembro
Mensajes: 6
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#
private
void
button1_Click
(
object
sender, EventArgs e
)
{
try
{
pictureBox1
.
Image
=
Image
.
FromFile
(
textBox1
.
Text
)
;
pictureBox1
.
SizeMode
=
PictureBoxSizeMode
.
AutoSize
;
}
catch
(
Exception exc
)
{
textBox1
.
Text
=
exc
.
Message
;
}
}
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#
Pen myPen
=
new
Pen
(
Color
.
Blue
)
;
pictureBox1
.
CreateGraphics
(
)
.
DrawRectangle
(
myPen, x, y,
5
,
5
)
;
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#
pictureBox1
.
CreateGraphics
(
)
.
Clear
(
Color
.
Transparent
)
;
Pen myPen
=
new
Pen
(
Color
.
Blue
)
;
pictureBox1
.
CreateGraphics
(
)
.
DrawRectangle
(
myPen, x, y,
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#
pictureBox1
.
CreateGraphics
(
)
.
Clear
(
Color
.
Transparent
)
;
pictureBox1
.
Image
=
Image
.
FromFile
(
textBox1
.
Text
)
;
Pen myPen
=
new
Pen
(
Color
.
Blue
)
;
pictureBox1
.
CreateGraphics
(
)
.
DrawRectangle
(
myPen, x, y,
5
,
5
)
;
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!!
Tweet
Jeysscarr
Miembro MUY activo
Mensajes: 134
Nacionalidad:
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#
static
Image im
;
private
void
button1_Click
(
object
sender, EventArgs e
)
{
im
=
Image
.
FromFile
(
"C:
\R
es2.png"
)
;
P1
.
Width
=
(
int
)
im
.
PhysicalDimension
.
Width
;
P1
.
Height
=
(
int
)
im
.
PhysicalDimension
.
Height
;
P1
.
Refresh
(
)
;
}
private
void
P1_Paint
(
object
sender, PaintEventArgs e
)
{
e
.
Graphics
.
Clear
(
Color
.
Transparent
)
;
Pen myPen
=
new
Pen
(
Color
.
Blue
)
;
e
.
Graphics
.
DrawImageUnscaled
(
im,
new
Point
(
0
,
0
)
)
;
e
.
Graphics
.
DrawRectangle
(
myPen,
0
,
0
,
20
,
20
)
;
}
private
void
Form1_Load
(
object
sender, EventArgs e
)
{
im
=
Image
.
FromFile
(
"C:
\r
esultados1.jpg"
)
;
P1
.
Width
=
(
int
)
im
.
PhysicalDimension
.
Width
;
P1
.
Height
=
(
int
)
im
.
PhysicalDimension
.
Height
;
}
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
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#
pictureBox1
.
CreateGraphics
(
)
.
Clear
(
Color
.
Transparent
)
;
Pen myPen
=
new
Pen
(
Color
.
Blue
)
;
pictureBox1
.
CreateGraphics
(
)
.
DrawImageUnscaled
(
im,
new
Point
(
0
,
0
)
)
;
pictureBox1
.
CreateGraphics
(
)
.
DrawRectangle
(
myPen, x, y,
3
,
3
)
;
Y luego el evento Paint del picturebox:
Código: C#
private
void
pictureBox1_Paint
(
object
sender, PaintEventArgs e
)
{
e
.
Graphics
.
Clear
(
Color
.
Transparent
)
;
Pen myPen
=
new
Pen
(
Color
.
Blue
)
;
e
.
Graphics
.
DrawImageUnscaled
(
im,
new
Point
(
0
,
0
)
)
;
e
.
Graphics
.
DrawRectangle
(
myPen, x, y,
3
,
3
)
;
}
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:
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
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
CLR: .Net / Mono / Boo / Otros CLR
»
C#
(Moderador:
ProfesorX
) »
Duda con clases PictureBox y Graphics