如何使用 GetPixel() 检查不同的位置

How to use GetPixel() to check different positions

我有一个必须使用 GetPixel 的程序,但在不同的位置,在读取一个值并对其求值后,它必须更改 x、y 位置并重新求值另一个函数的值。 我有当前代码:

while (true) {
        HDC hDC;
        hDC = GetDC(NULL);
       int cx = 793;
       int cy = 866;
COLORREF color = GetPixel(hDC, cx, cy); //Use x=793 y=866
        ReleaseDC(NULL, hDC);
        RGBTRIPLE rgb;
        int red = GetRValue(color);
        int green = GetGValue(color);
        int blue = GetBValue(color);
        std::thread t1 (verde, red, green, blue); 
        t1.join();
        std::thread t2(amarelo, red, green, blue);//But then here I would like it to read
       //from let's say x=803 y=796
        t2.join();
 }

问题是 GetPixel 应该对 verde 函数使用 X=793 AND Y=866,然后对 amarelo 函数使用 x=803 y=796

您问题的简单答案是您可以使用不同的坐标多次调用 GetPixel()

此外,无需在每次循环迭代时调用 GetDC(0)。你应该在进入循环之前调用它一次。

试试这个:

COLORREF color;
int red, green, blue;

HDC hDC = GetDC(NULL);
while (some_condition_is_true) { // don't write infinite loops!
    color = GetPixel(hDC, 793, 866);
    red = GetRValue(color);
    green = GetGValue(color);
    blue = GetBValue(color);
    std::thread t1(verde, red, green, blue); 
    t1.join();

    color = GetPixel(hDC, 803, 796);
    red = GetRValue(color);
    green = GetGValue(color);
    blue = GetBValue(color);
    std::thread t2(amarelo, red, green, blue);
    t2.join();
}
ReleaseDC(NULL, hDC);

但是,话虽这么说,您的线程却被浪费了。您的循环在启动第二个线程之前等待第一个线程完成而被阻塞,并且在进入下一个循环迭代之前等待第二个线程完成而被阻塞。你是运行你的代码序列化了,违背了使用线程的目的,所以你还不如干脆去掉线程,直接调用函数:

COLORREF color;
int red, green, blue;

HDC hDC = GetDC(NULL);
while (some_condition_is_true) {
    color = GetPixel(hDC, 793, 866);
    red = GetRValue(color);
    green = GetGValue(color);
    blue = GetBValue(color);
    verde(red, green, blue);

    color = GetPixel(hDC, 803, 796);
    red = GetRValue(color);
    green = GetGValue(color);
    blue = GetBValue(color);
    amarelo(red, green, blue);
}
ReleaseDC(NULL, hDC);

如果你想使用线程并行处理多个像素,它应该看起来更像这样:

COLORREF color;
int red, green, blue;

HDC hDC = GetDC(NULL);
while (some_condition_is_true) {
    color = GetPixel(hDC, 793, 866);
    red = GetRValue(color);
    green = GetGValue(color);
    blue = GetBValue(color);
    std::thread t1(verde, red, green, blue); 

    color = GetPixel(hDC, 803, 796);
    red = GetRValue(color);
    green = GetGValue(color);
    blue = GetBValue(color);
    std::thread t2(amarelo, red, green, blue);

    t1.join();
    t2.join();
}
ReleaseDC(NULL, hDC);

甚至像这样:

void verde(HDC hDC, int x, int y)
{
    COLORREF color;
    int red, green, blue;

    while (some_condition_is_true) {
        color = GetPixel(hDC, x, y);
        red = GetRValue(color);
        green = GetGValue(color);
        blue = GetBValue(color);
        //...
    }
} 

void amarelo(HDC hDC, int x, int, y)
{
    COLORREF color;
    int red, green, blue;

    while (some_condition_is_true) {
        color = GetPixel(hDC, x, y);
        red = GetRValue(color);
        green = GetGValue(color);
        blue = GetBValue(color);
        //...
    }
} 

HDC hDC = GetDC(NULL);

std::thread t1(verde, hDC, 793, 866);
std::thread t2(amarelo, hDC, 803, 796);

t1.join();
t2.join();

ReleaseDC(NULL, hDC);