避免自動縮放以改善效能

如果您只將影像的左上角傳遞至 DrawImage 方法,GDI+ 可能會縮放影像,如此一來可能會降低效能。

下列 DrawImage 方法呼叫會指定左上角位於 (50, 30),但是不會指定目的端矩形:

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)

雖然就所需的引數個數而言,這是 DrawImage 方法最簡單的版本,但是不一定最有效。如果用於 GDI+ 的解析度 (通常是 96 DPI) 與儲存於 Image 物件的解析度不同,則 DrawImage 會縮放影像。例如,假設 Image 物件的寬度為 216 像素,並且儲存的水平解析度值為 72 DPI。因為 216 除以 72 等於 3,所以 DrawImage 會縮放影像,將影像寬度調整為 3 英吋,解析度為 96 DPI。也就是說,DrawImage 所顯示的影像寬度為 96x3 = 288 像素。

即使您的螢幕解析度不是 96 DPI,GDI+ 可能還是會將螢幕解析度當做是 96 DPI 來縮放影像。那是因為 GDI+ Graphics 物件與裝置內容有關,並且在 GDI+ 查詢裝置內容以取得螢幕解析度時,不論實際螢幕解析度為何,結果通常是 96。

如果不想進行這類縮放,請將目的端矩形的寬度和高度傳遞至 DrawImage 方法。下列範例會繪製兩次相同的影像。第一種情況不指定目的端矩形的寬度和高度,而是自動縮放影像。第二種情況會將目的端矩形的寬度和高度 (以像素為單位) 指定成與原始影像的寬度和高度相同。

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

下圖顯示的是呈現兩次的影像。