c++ - GetPixel 返回不正确的值

标签 c++ getpixel

这是我在这个论坛上的第一篇帖子,如果我没有在正确的位置发布它或者如果我做错了什么,请不要对我太严厉,我很少在论坛上发帖。所以,我对 GetPixel 函数有这个问题。基本上,它应该返回 x、y 处的颜色小数。我即将发布的代码在 Windows 7 32 位上完美运行,但最近我买了一台带有 Windows 8.1 64 位的新笔记本电脑 y50-70,相同的代码运行完全不同。我找不到任何解决问题的方法,甚至无法描述它。我认为这可能与桌面句柄、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/q2H2M8WLHVI https://youtu.be/UcneHwXaGoM

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

最佳答案

这可能是 DPI 缩放的问题。

如果您的新显示器的每英寸点数高于平均水平,则 Windows 默认情况下会拉伸(stretch)图形。默认情况下,Windows 假定程序忽略 DPI。如果 Windows 不拉伸(stretch)图形,则未针对 DPI 进行调整的程序将在高密度显示器上的小窗口中显示微小的文本。

这有点黑客行为。一些允许您询问显示器和窗口的 Windows API 和消息将在“平均”每英寸 96 像素与显示器的实际 DPI 之间转换坐标。同样,让您调整事物大小的 API 会执行相反的转换。所以这对于程序来说基本上是透明的。但它并不完美,因为并非所有 API 都能以一致的方式进行缩放。

所以我的猜测是,您的笔记本电脑具有高分辨率显示屏,GetPixel 不会转换 DPI 缩放的坐标,并且鼠标位置转换为 DPI 缩放。结果是您要求的像素并未真正与鼠标对齐。

我建议的解决方案是告诉 Windows 您的程序是“DPI 感知的”。做这件事有很多种方法。对于您的情况,最简单的方法可能是调用 SetProcessDPIAware就在程序的开头。您也可以通过在 list 中标记您的程序来做到这一点。根据您使用的编译器,可能有一个命令行选项来自动创建您需要的 list 。

关于c++ - GetPixel 返回不正确的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29678763/

相关文章:

c++ - 具有一个默认参数的构造函数

java - 整型 RGB 到 HEX 值

c++ - 安全使用在指针后写入数据的函数

c++ - 在同一项目中的 2 个不同的 C++ 文件之间传递值

c++ - 如何避免硬盘抖动

c++ - OpenCV 中的轮廓?

c++ - 如何从 Mat 变量编辑/读取 OpenCv 中的像素值?

java - 在屏幕上快速收集图像并读取像素

c# - 将 .bmp 文件解码为二进制文件

python - 在读取图像的 RGB 像素值时,matlab 和 python 中的绿色值不同