CodeGo.net>为什么WinForms绘制我的图像的4倍大小?
作者:互联网
我正在使用WinForms创建具有96dpi分辨率的512×512 px图像.初始化后,我使用OnPaint通过Graphics.DrawImage绘制此图像.运行该程序时得到的是以下图像:本质上是一个1024×1024图像,其中包含一些模糊不清的图像,类似于我要显示的图像,不同之处在于它由2×2像素的块组成,它们的颜色均一.这很奇怪.
有人可以帮我弄清楚发生了什么吗?这仅在高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的胡说只是分散注意力.
解决方法:
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