# c++ Pixel auslesen beschleunigen



## norad (19. November 2008)

Morgen,
ich lese aus einem Screenshot vom aktuellen Bildschirm die Pixel infos aus und suche dann nach einem zuvor eingelesenen bild dessen Infos in dem String such gespeichert sind.

Funktioniert soweit auch ganz gut nur hab ich ein Problem und das is die Geschwindigkeit. wenn ich alle Pixel auswerten möchte dauert das fast !_5 min_!  Hat jemand eine Idee wie man diesen Vorgang beschleunigen kann?

Hier mein code:


```
char vergleich[15000];for(int i=0;i<14999;i++){vergleich[i]=NULL;}
                  int subtra=0;
                  HDC dc=GetDC(0); //Bildschirm lesen
                 for(int j=0;j<1000;j++)
                 {
                  for(int i=0;i<1000;i++)
                  {
                  COLORREF c = GetPixel(dc, i, j);
                  sprintf(vergleich,"%s %i",vergleich,GetRValue(c));
                  sprintf(vergleich,"%s %i",vergleich,GetGValue(c));
                  sprintf(vergleich,"%s %i",vergleich,GetBValue(c));
                  if(GetRValue(c)<100&&GetRValue(c)>10){subtra++;}
                  if(GetGValue(c)<100&&GetGValue(c)>10){subtra++;}
                  if(GetBValue(c)<100&&GetBValue(c)>10){subtra++;}
                  if(GetRValue(c)<10){subtra+=2;}
                  if(GetGValue(c)<10){subtra+=2;}
                  if(GetBValue(c)<10){subtra+=2;}
                  verg=vergleich;
                  
                
                  if(verg.find(such)<20000){char gefunden[100]; sprintf(gefunden,"gefunden x: %i y: %i",(verg.find(such)+subtra)/12,j);MessageBox(NULL,gefunden,"",NULL);i=1000;j=1000;}
                 
                    }
             
                  subtra=0;
                  out<<"zeile "<<j<<" "<<vergleich<<endl;
                  for(int i=0;i<14999;i++){vergleich[i]=NULL;}
                  verg="";
                
                  
                  }
```

Schonmal vielen dank im Vorraus 

Gruß


----------



## MCoder (19. November 2008)

Hallo,

GetPixel() ist für sowas tatsächlich die mit Abstand schlechteste Lösung. Am besten erstellt man sich einen Buffer mit den Pixeldaten und arbeitet damit. Da das Ganze dann allerdings etwas komplexer wird, habe ich mal etwas Code mit angehängt; hoffentlich fehlerfrei 

Gruß
MCoder



```
int     nWidth    = GetSystemMetrics(SM_CXFULLSCREEN);
int     nHeight   = GetSystemMetrics(SM_CYFULLSCREEN);

HDC     hdcScreen = GetWindowDC(0); 
HDC     hdcMem    = CreateCompatibleDC(hdcScreen);
HBITMAP hbm       = CreateCompatibleBitmap(hdcScreen, nWidth, nHeight);
HBITMAP hbmOld    = (HBITMAP)SelectObject(hdcMem, hbm);

BitBlt(hdcMem, 0, 0, nWidth, nHeight, hdcScreen, 0, 0, SRCCOPY);

BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(bmi));
bmi.bmiHeader.biSize         = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth        = nWidth;
bmi.bmiHeader.biHeight       = nHeight;
bmi.bmiHeader.biBitCount     = 24;
bmi.bmiHeader.biPlanes       = 1;
bmi.bmiHeader.biCompression  = BI_RGB;
bmi.bmiHeader.biSizeImage    = nWidth * nHeight * 3;

BYTE *pbBits = new BYTE[bmi.bmiHeader.biSizeImage];

GetDIBits( hdcMem, 
           hbm,
           0,
           bmi.bmiHeader.biHeight,
           pbBits,
           &bmi,
           DIB_RGB_COLORS );

RGBTRIPLE *pRgb = (RGBTRIPLE *)pbBits;

for( int y = 0; y < nHeight; y++ )
{
    for( int x = 0; x < nWidth; x++ )
    {
        BYTE nRed   = pRgb[x].rgbtRed;
        BYTE nGreen = pRgb[x].rgbtGreen;
        BYTE nBlue  = pRgb[x].rgbtBlue;
    }
    
    pRgb = (RGBTRIPLE *)((LPBYTE)pRgb + (sizeof(RGBTRIPLE) * nWidth));
}

delete [] pbBits;

SelectObject(hdcMem, hbmOld);
ReleaseDC(0, hdcScreen);
ReleaseDC(0, hdcMem);
```


----------



## devDevil (19. November 2008)

@norad: du hast so ziemlich in jeder Zeile ne performance sünde  darin könnte es neben GetPixel auch noch liegen


----------



## norad (20. November 2008)

danke für die antwort.
hatte keine Zeit heute hier reinzuschaun^^. hab aber mal selbst gegoogelt und weis inzwischen auch das der Code was performance angeht der Untergang ist .

probirs heute abend mal aus.

Gruß


----------

