为什么WinForms将我的图像绘制为4倍大小?

时间:2016-02-25 16:51:08

标签: c# winforms bitmap system.drawing highdpi

我正在使用WinForms创建分辨率为96dpi的512x512像素图像。初始化后,我使用OnPaint使用Graphics.DrawImage绘制此图像。我运行程序的结果是下面显示的图像:基本上是一个1024x1024的图像,其中包含一些与我想要显示的模糊相似的jung,除了它由2x2像素的块组成,所有块都具有统一相同的颜色。这很奇怪。

有人可以帮我弄清楚发生了什么吗?这只发生在高DPI显示器上,该程序在普通显示器上运行良好。

enter image description here

更新1:我使用SetProcessDpiAwareness(_Process_DPI_Awareness.Process_DPI_Unaware);明确将流程设置为不知道DPI,并在矩形中明确调用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的废话只是一种分心。

1 个答案:

答案 0 :(得分:4)

  

这只发生在高DPI显示器上

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

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

非粗暴的方式是你宣布你的节目是dpiAware。现在,Windows不再有用,而且是负责这项工作的Graphics.DrawImage()。它本身重新缩放图像以使图像DPI与显示器DPI匹配。文字看起来很清脆。图像,嗯,你必须进一步移动你的椅子。

如果您不想进行此重新缩放,则必须使用带有 Rectangle 参数的Graphics.DrawImage()重载。但请记住,图像在如此漂亮的显示屏上变成了邮票。你必须把你的椅子拉近:)