gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:22:26 24 4
gpt4 key购买 nike

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

谁能帮我弄清楚这是怎么回事?这只发生在高 DPI 显示器上,该程序在普通显示器上运行良好。

enter image description here

更新 1:我使用 SetProcessDpiAwareness(_Process_DPI_Awareness.Process_DPI_Unaware); 显式地将进程设置为 DPI-unaware,并显式调用 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() 重载。但请记住,在如此漂亮的显示器上,图像会变成邮票。你得把椅子挪近点:)

关于c# - 为什么 WinForms 将我的图像绘制为 4 倍大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35633431/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com