c++ Pixel auslesen beschleunigen

norad

Grünschnabel
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_! :confused: Hat jemand eine Idee wie man diesen Vorgang beschleunigen kann?

Hier mein code:

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ß
 
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


C++:
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);
 
@norad: du hast so ziemlich in jeder Zeile ne performance sünde ;) darin könnte es neben GetPixel auch noch liegen ;)
 
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 :D.

probirs heute abend mal aus.

Gruß
 
Zurück