Porady: poprawianie wydajności dzięki unikaniu automatycznego skalowania

Funkcja GDI+ może automatycznie skalować obraz podczas rysowania, co zmniejszy wydajność. Alternatywnie można kontrolować skalowanie obrazu, przekazując wymiary prostokąta docelowego do DrawImage metody.

Na przykład następujące wywołanie DrawImage metody określa lewy górny róg (50, 30), ale nie określa prostokąta docelowego.

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

Chociaż jest to najłatwiejsza wersja DrawImage metody pod względem liczby wymaganych argumentów, niekoniecznie jest to najbardziej wydajne. Jeśli rozdzielczość używana przez GDI+ (zwykle 96 kropek na cal) różni się od rozdzielczości przechowywanej Image w obiekcie, DrawImage metoda będzie skalować obraz. Załóżmy na przykład, że Image obiekt ma szerokość 216 pikseli i przechowywaną wartość rozdzielczości poziomej 72 kropek na cal. Ponieważ 216/72 wynosi 3, DrawImage przeskaluje obraz tak, aby miał szerokość 3 cali w rozdzielczości 96 kropek na cal. Oznacza to, DrawImage że zostanie wyświetlony obraz o szerokości 96x3 = 288 pikseli.

Nawet jeśli rozdzielczość ekranu różni się od 96 kropek na cal, GDI+ prawdopodobnie przeskaluje obraz tak, jakby rozdzielczość ekranu miała 96 kropek na cal. Wynika to z faktu, że obiekt GDI+ Graphics jest skojarzony z kontekstem urządzenia, a gdy GDI+ wysyła zapytanie do kontekstu urządzenia dla rozdzielczości ekranu, wynik jest zwykle 96, niezależnie od rzeczywistej rozdzielczości ekranu. Automatyczne skalowanie można uniknąć, określając prostokąt docelowy w metodzie DrawImage .

Przykład

Poniższy przykład dwukrotnie rysuje ten sam obraz. W pierwszym przypadku nie określono szerokości i wysokości prostokąta docelowego, a obraz jest automatycznie skalowany. W drugim przypadku szerokość i wysokość (mierzona w pikselach) prostokąta docelowego są określane tak samo jak szerokość i wysokość oryginalnego obrazu. Na poniższej ilustracji przedstawiono dwukrotnie renderowany obraz:

Screenshot that shows images with scaled texture.

Image image = new Bitmap("Texture.jpg");

e.Graphics.DrawImage(image, 10, 10);
e.Graphics.DrawImage(image, 120, 10, image.Width, image.Height);
Dim image As New Bitmap("Texture.jpg")

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

Kompilowanie kodu

Powyższy przykład jest przeznaczony do użycia z formularzami Windows Forms i wymaga PaintEventArgseparametru , który jest parametrem Paint programu obsługi zdarzeń. Zastąp ciąg Texture.jpg nazwą obrazu i ścieżką prawidłową w systemie.

Zobacz też