有不太为人所知的一点是,如果你画一个图像,例如:
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
Graphics.DrawImageUnscaled方法(Image,Int32,Int32)
使用其原始物理大小在由坐标对指定的位置绘制指定的图像。
Graphics.DrawImage方法(Image,Int32,Int32)
在由坐标对指定的位置使用其原始物理大小绘制指定的图像。
Graphics.DrawImage方法(Image,Int32,Int32,Int32,Int32)
在指定的位置以及指定的大小上绘制指定的图像。
DrawImage
也会缩放图像 - 除非你强制绘制的大小与源图像的大小相同。因此,语句“使用DrawImage
方法以原始像素大小绘制图像”是误导性的。有人可能会认为DrawImage
以原始像素大小绘制图像。 - Ian Boyd