GetPixel返回不正确的值

GetPixel returns incorrect values

本文关键字:不正确 返回 GetPixel      更新时间:2023-10-16

这是我在这个论坛上的第一篇帖子,如果我没有把它发布在正确的地方,或者如果我做错了什么,请不要对我太苛刻,我很少在论坛上发帖。所以,我对GetPixel函数有这个问题。基本上,它应该返回x,y的颜色小数。我即将发布的代码在windows 7 32位上运行得很好,但最近我买了一台新的笔记本电脑y50-70,windows 8.1 64位,相同的代码完全不同。我找不到任何解决问题的方法,甚至无法描述它。我认为这可能与桌面句柄、HDC、GetDC()、GetPixel()有关,甚至可能与我的计算机分辨率、刷新率或类似的东西有关。。。我甚至录制了一些视频,可以帮助你理解我遇到的问题,因为我甚至无法正确描述它。这就像真正的颜色离我的鼠标指向的地方x=219,y=407。新的笔记本电脑已经使用了3周,我甚至尝试过1次系统恢复,但这并没有解决问题。

请随意使用此代码,希望它能很好地为您服务:

#include <iostream>
#include <Windows.h>
using namespace std;
void Detect();
int main()
{
Detect();
return 0;
}
void Detect()
{
POINT p;
HDC hDC = GetDC(0);
int x, y;
while (!GetAsyncKeyState(VK_INSERT)) // Press insert to stop
{
GetCursorPos(&p);
x = p.x;
y = p.y;
hDC = GetDC(0);
cout << x << " " << y << " " << GetPixel(hDC, x, y) << endl;
Sleep(50);
}
ReleaseDC(0, hDC);
}

以下问题的链接:https://youtu.be/q2H2M8WLHVIhttps://youtu.be/UcneHwXaGoM

如果有人能以某种方式提供帮助,或者告诉我该做什么,该去哪里,我会非常非常感激。我开始编程的主要原因之一是因为这样的事情,处理颜色、条件等……现在我无法进一步前进,这真的很可悲。希望听到回复。非常感谢。

这可能是DPI缩放的问题。

如果你的新显示器每英寸的点数高于平均值,那么Windows默认情况下会拉伸图形。默认情况下,Windows假定程序忽略DPI。如果Windows不拉伸图形,那么没有根据DPI进行调整的程序将在高密度显示器上的小窗口中显示微小的文本。

这有点像黑客。让您询问显示器和窗口的一些Windows API和消息将在"平均"每英寸96像素和显示器的实际DPI之间转换坐标。同样,让您调整大小的API也会进行相反的转换。因此,这在很大程度上对该项目是透明的。但它并不完美,因为并非所有的API都能以一致的方式进行扩展。

所以我的猜测是,你的笔记本电脑有一个高分辨率显示器,GetPixel不会为DPI缩放转换坐标,鼠标位置也会为DPI比例转换。结果是,你要的像素并没有真正与鼠标对齐。

我建议的解决方案是告诉窗口你的程序是"DPI感知"。有几种方法可以做到这一点。在您的情况下,最简单的方法可能是在程序开始时调用SetProcessDPIAware。你也可以在清单中标记你的程序。根据您使用的编译器,可能会有一个命令行选项来自动创建所需的清单。

另一个对我有效的选择是更改"控制面板"中的设置,禁用每台设备的DPI缩放。你在运行多台显示器吗?

Win 8.1在"控制面板"中引入了一个新设置,上面写着"让我为所有显示器选择一个DPI缩放"。通过取消转换,它被关闭了。打开它对我有效。

查看此视频以查找设置:https://www.youtube.com/watch?v=sE3IUTPy1WA

我很好奇,所以当你不使用SetProccesDPIAware()时,请告诉我这是否适用