我正在使用WinForms创建分辨率为96dpi的512x512像素图像。初始化后,我使用OnPaint
使用Graphics.DrawImage
绘制此图像。我运行程序的结果是下面显示的图像:基本上是一个1024x1024的图像,其中包含一些与我想要显示的模糊相似的jung,除了它由2x2像素的块组成,所有块都具有统一相同的颜色。这很奇怪。
有人可以帮我弄清楚发生了什么吗?这只发生在高DPI显示器上,该程序在普通显示器上运行良好。
更新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感知之后,我现在获得相同的垃圾,但尺寸合适:
编辑3:最后得到它,工件是我在CUDA端渲染错误的结果。高DPI的废话只是一种分心。
答案 0 :(得分:4)
这只发生在高DPI显示器上
这是完全正常的,您看到图像重新调整以匹配显示器的DPI。这使得它更大,所以以英寸为单位的大小是相同的。
完成这项工作的原因是您依赖DPI虚拟化。 Windows让您的程序与96 DPI监视器上的行为相似,但可以将其绘制成位图。并重新调整位图以在屏幕上显示它。非常粗糙,但你的程序仍然可用,文本质量非常明显。
非粗暴的方式是你宣布你的节目是dpiAware。现在,Windows不再有用,而且是负责这项工作的Graphics.DrawImage()。它本身重新缩放图像以使图像DPI与显示器DPI匹配。文字看起来很清脆。图像,嗯,你必须进一步移动你的椅子。
如果您不想进行此重新缩放,则必须使用带有 Rectangle 参数的Graphics.DrawImage()重载。但请记住,图像在如此漂亮的显示屏上变成了邮票。你必须把你的椅子拉近:)