其他分享
首页 > 其他分享> > CodeGo.net>为什么WinForms绘制我的图像的4倍大小?

CodeGo.net>为什么WinForms绘制我的图像的4倍大小?

作者:互联网

我正在使用WinForms创建具有96dpi分辨率的512×512 px图像.初始化后,我使用OnPaint通过Graphics.DrawImage绘制此图像.运行该程序时得到的是以下图像:本质上是一个1024×1024图像,其中包含一些模糊不清的图像,类似于我要显示的图像,不同之处在于它由2×2像素的块组成,它们的颜色均一.这很奇怪.

有人可以帮我弄清楚发生了什么吗?这仅在高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的胡说只是分散注意力.

解决方法:

This is only happening on high-DPI displays

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

完成此操作的粗略方法是依靠DPI虚拟化. Windows让您的程序表现得像在96 DPI监视器上一样,但是可以将其绘制到位图中.并重新缩放该位图以将其显示在屏幕上.相当粗糙,但是您的程序仍然可用,文本质量明​​显受损.

不粗鲁的方式是当您声明程序为dpiAware时.Windows不再提供帮助,而由Graphics.DrawImage()负责此工作.它本身会重新缩放图像以使图像DPI与显示DPI匹配.文字看起来非常清晰.图片,嗯,您必须将椅子向后移动.

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

标签:system-drawing,bitmap,highdpi,c,winforms
来源: https://codeday.me/bug/20191027/1943403.html