PageScale y PageUnit de Graphics

06/09/2004 - 01:59 por 44r0x0r44 | Informe spam
Buenas tardes!!!

Llevo varios dias topandome con un problema que por el
momento no estoy
consiguiendo solucionar, quisiera apelar a la sabiduria
general de los presentes
en busca de inspiración; gracias.

El problema consiste en lo siguiente:

tengo un formulario cuya BackgroundImage es:
'-
Me.BackgroundImage = New Bitmap (Height, Width):
Graphics.FromImage(BackgroundImage).Clear(Colors.AliceBlue)
'-

tengo también una subrutina que dibujará una imagen
cualquiera en una
posición determinada de la BackgroundImage y la escalará
para que ocupe la
parte restante del formulario:

'-
Sub PutImage(ByVal o As Image, ByVal d As Image, ByVal p As
Point)

Dim G As Graphics = Graphics.FromImage(o)
G.PageUnit = GraphicsUnit.Pixel
G.PageScale = 1

G.DrawImage(d, Rectangle.FromLTRB(p.X, p.Y, o.Width, o.Height))

End Sub
'-

el problema reside en que, suponiendo un formulario
{Height00; Width00} si
llamo a:

'-
PutImage(BackgroundImage, New Image("c:\test.bmp"), New
Point(50, 50))
'-

el resultado es que la imagen test.bmp empieza a dibujarse
en el punto [50,50]
(como cabí­a esperar) mientas que la esquina inferior
derecha NO se situa en el
punto [300,300], sinó que se situa un punto fuera del
formulario.

Una llamada a MessageBox.Show(Rectangle.FromLTRB(p.X, p.Y,
o.Width, o.Height).ToString) dentro de PutImage nos indica
que el rectangulo que toma
como argumento DrawImage es {XP; YP; Height%0;
Width%0}, tal y como cabía esperar, aún así la imagen no
se escala correctamente, decidí­ investigar que podría
estar afectando a estas
operaciones y llegué a la conclusión de que tení­an que ser
las propiedades
PageScale y PageUnit de la clase Graphics.

A mi entender PageUnit define en que unidades estamos
trabajando y PageScale la
escala de dichas unidades, por lo tanto, definiendo la
primera como Pixel y la
segunda como 1 estaremos trabajando con pixels reales de
pantalla: un Rectangle
de 50x50 ocupará 50 pixels y si fuese PageUnit GraphicsUnit.Pixel y PageScale
= 5, un Rectangle de 50x50 ocupará 250x250 pixels.

Por lo tanto aplico Pixel a PageScale y 1 a PageUnit con la
esperanza de que el
resultado sea el esperado y ¡sorpresa! actua exactamente
igual de "mal" que
antes.

¿en que me he equivocado?

Saludos, 44r0x0r44.
 

Leer las respuestas

#1 DJ Miao
06/09/2004 - 16:01 | Informe spam
Ya tenemos el poeta del foro.




Miao...

Buenas tardes!!!

Llevo varios dias topandome con un problema que por el
momento no estoy
consiguiendo solucionar, quisiera apelar a la sabiduria
general de los presentes
en busca de inspiración; gracias.

El problema consiste en lo siguiente:

tengo un formulario cuya BackgroundImage es:
'-
Me.BackgroundImage = New Bitmap (Height, Width):
Graphics.FromImage(BackgroundImage).Clear


(Colors.AliceBlue)
'-

tengo también una subrutina que dibujará una imagen
cualquiera en una
posición determinada de la BackgroundImage y la escalará
para que ocupe la
parte restante del formulario:

'-
Sub PutImage(ByVal o As Image, ByVal d As Image, ByVal p


As
Point)

Dim G As Graphics = Graphics.FromImage(o)
G.PageUnit = GraphicsUnit.Pixel
G.PageScale = 1

G.DrawImage(d, Rectangle.FromLTRB(p.X, p.Y, o.Width,


o.Height))

End Sub
'-

el problema reside en que, suponiendo un formulario
{Height00; Width00} si
llamo a:

'-
PutImage(BackgroundImage, New Image("c:\test.bmp"), New
Point(50, 50))
'-

el resultado es que la imagen test.bmp empieza a


dibujarse
en el punto [50,50]
(como cabí­a esperar) mientas que la esquina inferior
derecha NO se situa en el
punto [300,300], sinó que se situa un punto fuera del
formulario.

Una llamada a MessageBox.Show(Rectangle.FromLTRB(p.X,


p.Y,
o.Width, o.Height).ToString) dentro de PutImage nos


indica
que el rectangulo que toma
como argumento DrawImage es {XP; YP; Height%0;
Width%0}, tal y como cabía esperar, aún así la imagen


no
se escala correctamente, decidí­ investigar que podría
estar afectando a estas
operaciones y llegué a la conclusión de que tení­an que


ser
las propiedades
PageScale y PageUnit de la clase Graphics.

A mi entender PageUnit define en que unidades estamos
trabajando y PageScale la
escala de dichas unidades, por lo tanto, definiendo la
primera como Pixel y la
segunda como 1 estaremos trabajando con pixels reales de
pantalla: un Rectangle
de 50x50 ocupará 50 pixels y si fuese PageUnit >GraphicsUnit.Pixel y PageScale
= 5, un Rectangle de 50x50 ocupará 250x250 pixels.

Por lo tanto aplico Pixel a PageScale y 1 a PageUnit con


la
esperanza de que el
resultado sea el esperado y ¡sorpresa! actua exactamente
igual de "mal" que
antes.

¿en que me he equivocado?

Saludos, 44r0x0r44.
.

Preguntas similares