代码之家  ›  专栏  ›  技术社区  ›  XCS

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

  •  0
  • XCS  · 技术社区  · 14 年前

    #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 回复  |  直到 8 年前
        1
  •  2
  •   Beta    14 年前

    小的 整数数组。一旦你成功了,就转到更复杂的案例。

    编辑:
    你有足够的知识来做这件事吗?克里斯蒂,请不要误会,但在我遇到的所有程序员中,最糟糕的是那些认为自己没什么可学的人。我并没有在你的代码中寻找bug,因为你的代码过于复杂,如果你在构建它的时候从简单到复杂,你会很快发现你的错误。

        2
  •  1
  •   Derrick    14 年前

        3
  •  0
  •   XCS    14 年前

    指针算法:

            B= *(byteptr+pitch*j+3*i);
            G= *(byteptr+pitch*j+3*i+1);
            R= *(byteptr+pitch*j+3*i+2);
    

        B= *(byteptr+pitch*j+4*i);
        G= *(byteptr+pitch*j+4*i+1);
        R= *(byteptr+pitch*j+4*i+2);
    

    我想。。。我会回来与编辑,如果这个工作与否。

    编辑:是 ,它给出了正确的像素位置。谢谢大家的帮助:)。