Практическое руководство. Повышение производительности за счет отключения автоматического масштабирования

GDI+ позволяет автоматически масштабировать изображение по мере его рисования, что снижает производительность. Вы также можете управлять масштабированием изображения, передавая размеры целевого прямоугольника методу DrawImage.

Например, приведенный ниже вызов метода DrawImage задает левый верхний угол (50, 30), но не задает целевой прямоугольник.

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

Хотя это самая простая версия метода DrawImage с точки зрения количества требуемых аргументов, она не обязательно наиболее эффективная. Если разрешение, используемое GDI+ (обычно 96 точек на дюйм), отличается от разрешения в объектеImage, метод DrawImage масштабирует изображение. Например, предположим, что объект Image имеет ширину 216 пикселей и сохраненное значение разрешения по горизонтали 72 точки на дюйм. Так как 216/72 равно 3, DrawImage масштабирует изображение таким образом, чтобы оно было шириной 3 дюйма с разрешением 96 точек на дюйм. То есть DrawImage будет отображать изображение шириной 96 x 3 = 288 пикселей.

Даже если разрешение экрана отличается от 96 точек на дюйм, GDI+, скорее всего, будет масштабировать изображение, как если бы экран имел разрешение 96 точек на дюйм. Причина в том, что объект Graphics в GDI+ связан с контекстом устройства, а когда GDI+ запрашивает разрешение экрана из контекста устройства, результат обычно составляет 96 независимо от фактического разрешения экрана. Вы можете избежать автоматического масштабирования, указав целевой прямоугольник в методе DrawImage.

Пример

В примере ниже одно и то же изображение рисуется дважды. В первом случае ширина и высота целевого прямоугольника не заданы, и изображение масштабируется автоматически. Во втором случае ширина и высота целевого прямоугольника (в пикселях) указаны как совпадающие с шириной и высотой исходного изображения. На приведенном ниже рисунке показано изображение, отрисованное дважды.

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)

Компиляция кода

Предыдущий пример предназначен для работы с Windows Forms, и для него необходим объект PaintEventArgse, передаваемый в качестве параметра обработчику событий Paint. Замените Texture.jpg на имя изображения, имеющегося в вашей системе, и путь к нему.

См. также