.NET:Graphics.DrawImageUnscaled是什么意思?

15

不太为人所知的一点是,如果你画一个图像,例如:

graphics.DrawImage(image, top, left);

图片将被缩放。这是因为DrawImage查看图像的dpi设置(例如来自Photoshop的72dpi),并将图像缩放以匹配目标显示器(通常为96dpi)。

如果您想绘制没有任何缩放的图像,必须明确地给出DrawImage图像的大小:

graphics.DrawImage(img, top, left, img.Width, img.Height);

我知道这个问题是源于多年在GDI+编程中的经验。同样的事实也存在于.NET对GDI+的包装中的System.Drawing - 如果你想要绘制一个未缩放的图像,你必须强制它缩放到原始大小。
这就是为什么我很惊讶在.NET中找到了DrawImageUnscaled方法的原因。
graphics.DrawImageUnscaled(img, top, left);

除了图像仍然被缩放外,它与以下内容完全相同:
graphics.DrawImage(img, top, left);

如果您想绘制一个未缩放的图像,您必须继续调用:

graphics.DrawImage(img, top, left, img.Width, img.Height);

这让我想到了一个问题:如果不是用来绘制未缩放的图像,那么DrawImageUnscaled做什么呢?

来自MSDN

另请参阅


1
请查看以下答案:See this answer - LarsTech
根据那个答案:DrawImage也会缩放图像 - 除非你强制绘制的大小与源图像的大小相同。因此,语句“使用DrawImage方法以原始像素大小绘制图像”是误导性的。有人可能会认为DrawImage以原始像素大小绘制图像。 - Ian Boyd
这个thread讨论了DrawImageUnscaled相当于BitBlt,而DrawImage相当于ScaleBlt,但我猜他指的是StretchBlt。 - LarsTech
1
请参考微软MSDN的KB317174 - Hugh W
“如果您想绘制一个没有任何缩放的图像,您必须明确地给出DrawImage图像的大小” - 这是不正确的!为了避免与dpi相关的缩放问题,只需在绘制之前将图像的dpi适应当前屏幕dpi即可! - TaW
1个回答

7

很好,Graphics.DrawImageUnscaled方法(Image, Int32, Int32)DrawImage (Image, Int32, Int32)没有什么不同。

例如:

public void DrawImageUnscaled(Image image, int x, int y)
{
    this.DrawImage(image, x, y);
}

然而,接受高度、宽度或矩形的方法是不同的。这些方法要么忽略高度和宽度,要么仅使用矩形的顶部和左侧。

我的猜测是,DrawImageUnscaled Method (Image, Int32, Int32) 是出于平等原则存在的,并且与源设备和目标设备之间的dpi差异无关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接