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

时间:2016-11-01 20:19:04

标签: c++ winapi getpixel

我有一个程序可以使用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和Y = 866,然后对amarelo函数使用x = 803 y = 796

1 个答案:

答案 0 :(得分:1)

您问题的简单答案是,您可以使用不同的坐标多次调用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);