Miglioramento delle prestazioni evitando l'adattamento automatico

Se al metodo DrawImage si passa solo l'angolo in alto a sinistra di un'immagine è possibile che in GDI+ l'immagine venga adattata, con un conseguente calo delle prestazioni.

Nella chiamata che segue al metodo DrawImage viene specificato un angolo superiore sinistro di (50, 30) ma non un rettangolo di destinazione:

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)

Sebbene si tratti della versione più semplice del metodo DrawImage in termini di numero degli argomenti obbligatori, non è necessariamente la più efficiente. Se la risoluzione utilizzata da GDI+ (in genere 96 punti per pollice) è diversa dalla risoluzione memorizzata nell'oggetto Image, l'immagine verrà adattata da DrawImage. Si supponga, ad esempio, che un oggetto Image abbia una larghezza di 216 pixel e un valore di risoluzione orizzontale memorizzato di 72 punti per pollice. Poiché 216/72 è uguale a 3, l'immagine verrà adattata da DrawImage in modo che ne risulti una larghezza di 3 pollici con una risoluzione di 96 punti per pollice, ovvero l'immagine visualizzata da DrawImage avrà una larghezza di 96x3 = 288 pixel.

Anche se la risoluzione dello schermo è diversa da 96 punti per pollice, in GDI+ l'immagine verrà probabilmente adattata come se la risoluzione dello schermo fosse 96 punti per pollice. Un oggetto Graphics di GDI+ è infatti associato a un contesto di periferica e, quando in GDI+ viene eseguita una query nel contesto di periferica per cercare la risoluzione dello schermo, il risultato è in genere 96, indipendentemente dalla reale risoluzione dello schermo.

Per evitare tale adattamento, passare la larghezza e l'altezza di un rettangolo di destinazione al metodo DrawImage. Nell'esempio che segue viene disegnata due volte la stessa immagine. Nel primo caso la larghezza e l'altezza del rettangolo di destinazione non sono specificate e l'immagine viene adattata automaticamente. Nel secondo caso la larghezza e l'altezza, misurate in pixel, del rettangolo di destinazione sono specificate in modo da essere uguali a quelle dell'immagine originale.

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);

Nell'illustrazione che segue si mostra l'immagine visualizzata due volte.