好的,我正在尝试制作一个能找到桌面彩色像素位置的程序。为此,我制作了桌面的屏幕截图,然后浏览像素,并根据需要搜索具有匹配RGB的像素。唯一的问题是我的程序为找到的像素重新调整奇怪的坐标X,Y ...
#include <stdio.h>
#include <windows.h>
#include <atlimage.h>
#include <iostream>
using namespace std;
struct rgbcolor{
int red;
int green;
int blue;} myColor;
struct point{
int x;
int y;
};
point SearchPixel(int r,int g, int b){
CImage bitmapzor;
bitmapzor.Load(("C:\\1.bmp"));
COLORREF PixColor=0; //This is a color data
int R=0,G=0,B=0; //These are the channel values
BYTE* byteptr = (BYTE*)bitmapzor.GetBits();
int ok=0;
int pitch = bitmapzor.GetPitch(); //This is a pointer offset to get new line of the bitmap
//Go through every pixel and compare the RGB code
for (int i=0; i<bitmapzor.GetWidth();i++)
for (int j=0; j<bitmapzor.GetHeight();j++)
{
B= *(byteptr+pitch*j+3*i);
G= *(byteptr+pitch*j+3*i+1);
R= *(byteptr+pitch*j+3*i+2);
if(R==r&&G==g&&B==b)
{ point p;
p.x=i;
p.y=j;
cout<<"First pixel found at:\n X:"<<p.x<<"\n Y:"<<p.y<<"\n-----------------\n";
return p;
}
}
bitmapzor.Destroy(); //destroy the bitmap
point p;
p.x=-1;
p.y=-1;
cout<<"Pixel not found!\n";
return p;
}
bool ScreenCapture(int x, int y, int width, int height, char *filename){
// get a DC compat. w/ the screen
HDC hDc = CreateCompatibleDC(0);
// make a bmp in memory to store the capture in
HBITMAP hBmp = CreateCompatibleBitmap(GetDC(0), width, height);
// join em up
SelectObject(hDc, hBmp);
// copy from the screen to my bitmap
BitBlt(hDc, 0, 0, width, height, GetDC(0), x, y, SRCCOPY);
CImage image;
image.Attach(hBmp);
image.Save(("C:\\1.bmp"), Gdiplus::ImageFormatBMP);
SearchPixel(myColor.red,myColor.green,myColor.blue);
// free the bitmap memory
DeleteObject(hBmp);
return 1;
}
int main()
{ //RGB for the searched color
myColor.red=200;
myColor.green=191;
myColor.blue=231;
int count=0;
while(true){
ScreenCapture(0, 0, 1366, 768, "c:\\1.bmp");
count++;
cout<<"Number of searches:"<<count<<"\n\n";
Sleep(500);
}
system("pause");
return 0;
}
答案 0 :(得分:2)
嗯,这段代码可以简化很多,但首先我建议你尝试一个更简单的例子,比如在小整数数组中找到一个已知的整数。一旦你开始工作,就可以进入更复杂的案例。
修改:
你有足够的知识来做这件事吗?克里斯蒂,请不要采取错误的方式,但在我必须处理的所有程序员中,最糟糕的是那些认为没有什么可学的人。我实际上并没有在代码中查找错误,因为您的代码过于复杂,如果您在构建代码时从简单变为复杂,那么您很快就会发现错误。
答案 1 :(得分:1)
我建议你打印出前几个像素的RGB值,以确保你甚至正确地抓取像素数据。如果你的抵消是错误的,你永远不会让它工作。
答案 2 :(得分:0)
好的,最后我发现了一个我认为是导致这个问题的错误。
指针算术:
B= *(byteptr+pitch*j+3*i);
G= *(byteptr+pitch*j+3*i+1);
R= *(byteptr+pitch*j+3*i+2);
完成24位图像,但屏幕截图是32位图像,这意味着我必须将乘数更改为4 inteand为3.这意味着:
B= *(byteptr+pitch*j+4*i);
G= *(byteptr+pitch*j+4*i+1);
R= *(byteptr+pitch*j+4*i+2);
我想......如果有效,我会回来编辑。
编辑:是可行,它提供核心像素位置。谢谢大家的帮助:)。