如何使用 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);
我有一个必须使用 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);