3

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

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

在此处输入图像描述

更新 1:我明确地将进程设置为不感知 DPISetProcessDpiAwareness(_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 意识,我现在得到相同的垃圾,但大小合适:

在此处输入图像描述

编辑 3:终于明白了,工件是我在 CUDA 端错误渲染的结果。高 DPI 的废话只是分散注意力。

4

1 回答 1

4

这只发生在高 DPI 显示器上

这是完全正常的,您会看到图像被重新缩放以匹配显示器的 DPI。这使它更大,因此以英寸为单位的尺寸是相同的。

完成此任务的粗略方法是依赖 DPI 虚拟化。Windows 让您的程序像在 96 DPI 显示器上一样运行,但让它绘制成位图。并重新缩放该位图以将其显示在屏幕上。相当粗糙,但您的程序仍然可用,文本质量受到相当大的影响。

不粗鲁的方法是当您声明您的程序为dpiAware 时。现在 Windows 不再有帮助,而是 Graphics.DrawImage() 负责这项工作。它本身会重新缩放图像以使图像 DPI 与显示 DPI 匹配。文字看起来很清晰。图像,嗯,你必须把你的椅子往后挪一点。

如果您不希望发生这种重新缩放,那么您必须使用带有Rectangle参数的 Graphics.DrawImage() 重载。但请记住,在如此精美的显示器上,图像会变成一张邮票。你必须把你的椅子移近一点:)

于 2016-02-25T17:07:09.277 回答