在像素搜索算法中找不到错误

时间:2010-07-31 20:26:15

标签: c++ windows screenshot rgb pixel

好的,我正在尝试制作一个能找到桌面彩色像素位置的程序。为此,我制作了桌面的屏幕截图,然后浏览像素,并根据需要搜索具有匹配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;    
}

3 个答案:

答案 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);

我想......如果有效,我会回来编辑。

编辑:是可行,它提供核心像素位置。谢谢大家的帮助:)。