如何:通过避免自动缩放来提高性能

绘制图像时,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 将显示宽度为 96x3 = 288 像素的图像。

即使屏幕分辨率不同于每英寸 96 点,GDI+ 也会缩放图像,就像屏幕分辨率为每英寸 96 个点。 这是因为 GDI+ 对象与设备上下文相关联,并且当 GDI+ Graphics 查询设备上下文以获取屏幕分辨率时,结果通常是 96,而不考虑实际屏幕分辨率。 可以通过在方法中 DrawImage 指定目标矩形来避免自动缩放。

示例:

以下示例绘制同一图像两次。 在第一种情况下,未指定目标矩形的宽度和高度,并且图像会自动缩放。 第二种情况下,将指定目标矩形的宽度和高度(以像素为单位),其宽度和高度与原始图像的宽度和高度相同。 下图显示了两次呈现的图像:

显示具有缩放纹理的图像的屏幕截图。

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 窗体,它需要 PaintEventArgse,这是 Paint 事件处理程序的参数。 将 Texture.jpg 替换为系统上有效的映像名称和路径。

另请参阅