2016-02-25 71 views
3

我使用WinForms创建一个96xpi分辨率的512x512像素图像。初始化后,我使用OnPaint使用Graphics.DrawImage来绘制此图像。我在运行该程序时得到的图像如下所示:基本上是一张包含某些与我想要显示的内容相似的图像的1024x1024图像,除了它由2x2像素块组成,所有图像均具有相同的颜色。这很奇怪。为什么WinForms绘制我的图像大小的4倍?

有人能帮我弄清楚发生了什么事吗?这只发生在高DPI显示器上,该程序在普通的显示器上工作得很好。

enter image description here

更新1:我明确设置过程中要DPI,不知道有SetProcessDpiAwareness(_Process_DPI_Awareness.Process_DPI_Unaware);并明确在一个矩形调用DrawImage,即

e.Graphics.DrawImage(bmp, 
     new Rectangle(0, 0, 512, 512), 
     new Rectangle(0, 0, 512, 512), GraphicsUnit.Pixel); 

,并没有帮助。

编辑2:上打开DPI意识之后,我现在得到相同的垃圾,但在合适的尺寸:

enter image description here

编辑3:终于得到了它,文物是我在CUDA方面错误地渲染东西的结果。高DPI的废话只是一个分心。

+2

添加您用于绘制图像的代码。 – CathalMF

回答

4

这仅发生在高DPI显示

也就是说完全正常的,你所看到的图像得到重新调整,以匹配显示器的DPI。这使得它更大,所以以英寸为单位的尺寸是相同的。

完成这项工作的原始方法是当您依赖DPI虚拟化时。 Windows可以让你的程序像在96 DPI监视器上一样工作,但可以将它绘制成位图。并重新调整该位图以将其显示在屏幕上。非常粗糙,但你的程序仍然可用,文本质量非常明显。

不粗鲁的方法是当你宣布你的程序是dpiAware。现在Windows不再有帮助,它是负责这项工作的Graphics.DrawImage()。它本身重新缩放图像以使图像DPI与显示器DPI相匹配。文字看起来很脆。这张照片,呃,你必须把椅子放回去。

如果您不想重新缩放,则必须使用Graphics.DrawImage()重载,该重载需要使用Rectangle参数。但请记住,图像变成这样一个不错的显示器上的邮票。您必须将您的椅子移近:)

+0

遵循您的建议,并没有帮助 - 在明确禁用DPI感知并将图像设置为在特定矩形内呈现后的相同行为。 –

+1

禁用dpi意识然后编写该代码是没有意义的。奇怪这是这样的火箭科学。听起来像是它可能从未在第一个地方。 –

+0

对,所以我开启了DPI认识*,现在我得到了同样奇怪的垃圾图像,但我以正常尺寸获得了它。让我更新截图... –

相关问题