Compartir a través de


Mejorar el rendimiento evitando el ajuste de tamaño automático

Si sólo se pasa la esquina superior izquierda de una imagen al método DrawImage, GDI+ podría cambiar el tamaño de la imagen, lo que reduciría el rendimiento.

En la siguiente llamada al método DrawImage se especifica una esquina superior izquierda de (50, 30) pero no se especifica un rectángulo de destino:

e.Graphics.DrawImage(image, 50, 30) ' upper-left corner at (50, 30)
[C#]
e.Graphics.DrawImage(image, 50, 30);  // upper-left corner at (50, 30)

Aunque ésta es la versión más fácil del método DrawImage en lo que se refiere al número de argumentos requeridos, puede no ser la más eficaz. Si la resolución utilizada por GDI+ (normalmente 96 puntos por pulgada) es distinta de la almacenada en el objeto Image, DrawImage ajustará la escala de la imagen. Por ejemplo, si un objeto Image tiene un ancho de 216 píxeles y un valor de resolución horizontal almacenado de 72 puntos por pulgada, como 216/72 es 3, DrawImage ajustará la escala de la imagen de forma que tenga un ancho de 3 pulgadas con una resolución de 96 puntos por pulgada. Es decir, DrawImage mostrará una imagen que tiene un ancho de 96x3 = 288 píxeles.

Aunque la resolución de pantalla sea distinta de 96 puntos por pulgada, GDI+ ajustará probablemente la imagen como si la resolución de pantalla fuera 96 puntos por pulgada. Esto es debido a que un objeto Graphics de GDI+ se asocia con un contexto de dispositivo, y cuando GDI+ consulta a dicho contexto para averiguar la resolución de pantalla, el resultado es normalmente 96, sea cual sea la resolución de pantalla real.

Si desea impedir este ajuste de tamaño, pase al método DrawImage el ancho y el alto de un rectángulo de destino. En el ejemplo siguiente se dibuja la misma imagen dos veces. En el primer caso, el ancho y el alto del rectángulo de destino no se especifican y se ajusta automáticamente el tamaño de la imagen. En el segundo caso, se especifica que el ancho y el alto (medidos en píxeles) del rectángulo de destino sean iguales que el ancho y el alto de la imagen original.

Dim image = New Bitmap("Texture.jpg")

e.Graphics.DrawImage(image, 10, 10)
e.Graphics.DrawImage(image, 120, 10, image.Width, image.Height)
[C#]
Image image = new Bitmap("Texture.jpg");

e.Graphics.DrawImage(image, 10, 10);
e.Graphics.DrawImage(image, 120, 10, image.Width, image.Height);

En la siguiente ilustración se muestra la imagen procesada dos veces.