logo
CSharp_Graphics

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

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

Например, в показанном ниже вызове метода DrawImage указывается верхний левый угол с координатами (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 прямоугольник назначения.

Example

The following example draws the same image twice. In the first case, the width and height of the destination rectangle are not specified, and the image is automatically scaled. In the second case, the width and height (measured in pixels) of the destination rectangle are specified to be the same as the width and height of the original image. The following illustration shows the image rendered twice.

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

e.Graphics.DrawImage(image, 10, 10);

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

Compiling the Code

The preceding example is designed for use with Windows Forms, and it requires PaintEventArgs e, which is a parameter of the Paint event handler. Replace Texture.jpg with an image name and path that are valid on your system.

Пример

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

---