Поделиться через


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

Обновлен: Ноябрь 2007

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

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

Пример

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

Масштабированная текстура

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

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

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

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

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

См. также

Другие ресурсы

Работа с растровыми и векторными изображениями с использованием классов Image, Bitmap и Metafile

Работа с растровыми и векторными изображениями