Pixelsuche, TBitmap mit Scanline
-
ich seh nirgendswo ne Definition von scany vor der Schleife (die übrigends keinen Sinn ergibt). Schau dir nochmal an, wie du mit RGBTriple richtig arbeitest.
greetz KN4CK3R
-
KN4CK3R schrieb:
ich seh nirgendswo ne Definition von scany vor der Schleife (die übrigends keinen Sinn ergibt). Schau dir nochmal an, wie du mit RGBTriple richtig arbeitest.
greetz KN4CK3R
Global:
int scanx=0; int scany=0; TRGBTriple *xpix; TRGBTriple *ypix;
Hab die Schleifen geändert:
for(scanx=0; scanx < bmp->Width; scanx++) { for(scany=0; scany < bmp->Height; scany++) { ypix = reinterpret_cast<TRGBTriple *>(bmp->ScanLine[scany]); if(ypix->rgbtBlue == 100 && ypix->rgbtGreen==255 && ypix->rgbtRed ==255) { MessageBox(0,"Gefunden","test1",MB_OK); } } }
So wie ich es verstehe:
Die x Schleife fängt an mit 0, trifft dann auf die y Schleife. Y läuft dann bis es aus der Bildschirmrand trifft, dabei wird jedes Pixel von ScanLine überprüft und TRGBTriple gibt halt die 3 Farben an ypix weiter, bei der if abfrage wird jede Farbe überprüft um Herauszufinden ob die gewünschte Farbe sich gerade auf dem pixel befindet. Wenn Y-Schleife den Bildschirm erreicht läuft die X-Schleife um 1pixel weiter. Und so läuft alles bis X-Schleife über den Rand kommt.
-
nö, die linke Pixelreihe wird von oben nach unten bmp->Width mal durchsucht, zur Seite geht da nichts
greetz KN4CK3R
-
for(scanx=0; scanx < bmp->Width; scanx++) { xpix = reinterpret_cast<TRGBTriple *>(bmp->ScanLine[scanx]) for(scany=0; scany < bmp->Height; scany++) { ypix = reinterpret_cast<TRGBTriple *>(bmp->ScanLine[scany]); if(ypix->rgbtBlue == 100 && ypix->rgbtGreen==255 && ypix->rgbtRed ==255) { MessageBox(0,"Gefunden","test1",MB_OK); } } }
Ich glaube da fehlt noch was, werde mal darüber schlaffen, fällt mir jetzt nicht ein.
-
ich hab schonmal gesagt, du sollst dir anschauen, was ScanLine macht. Da kommt ein Pointer auf eine Zeile von links nach rechts zurück, die kannst du einfach als Array benutzen.
Ermöglicht einen indizierten, zeilenweisen Zugriff auf Pixel.
greetz KN4CK3R
-
TRGBTriple *xpix; //Global TRGBTriple *ypix; //Global for(scany=0; scany < bmp->Height; scany++) { ypix = (TRGBTriple *)bmp->ScanLine[scany]; for(scanx=0; scanx < bmp->Width; scanx++) { xpix = (TRGBTriple *)bmp->ScanLine[scanx]; if(ypix[scanx].rgbtBlue == 100 && ypix[scanx].rgbtGreen==255 && ypix[scanx].rgbtRed ==255) { MessageBox(0,"Gefunden","test1",MB_OK); } } }
So ungefähr?
-
nein, du brauchst nur einen Aufruf von ScanLine, danach den Pointer der zurückkommt mit x als Array benutzen. Den zweiten Aufruf kannst du wieder rauslöschen, der wird nicht gebraucht.
greetz KN4CK3R
-
Das muss es jetzt aber sein.
for(scany=0; scany < bmp->Height; scany++) { ypix = (TRGBTriple *)bmp->ScanLine[scany]; for(scanx=0; scanx < bmp->Width; scanx++) { if(ypix[scanx].rgbtBlue == 100 && ypix[scanx].rgbtGreen==255 && ypix[scanx].rgbtRed ==255) { MessageBox(0,"Gefunden","test1",MB_OK); } } }
-
ja jetzt sollte es funktionieren
greetz KN4CK3R
-
Also nochmal zu dem ganzen:
if(scanthread==true) { Graphics::TBitmap *bmp = new Graphics::TBitmap(); TCanvas *canvas = new TCanvas(); canvas->Handle = GetWindowDC(GetDesktopWindow()); TRect source; GetWindowRect(GetDesktopWindow(),(LPRECT)&source); bmp->Width = source.Right; bmp->Height = source.Bottom; bmp->Canvas->CopyRect(bmp->Canvas->ClipRect,canvas,source); for(scany=0; scany < bmp->Height; scany++) { ypix = (TRGBTriple *)bmp->ScanLine[scany]; for(scanx=0; scanx < bmp->Width; scanx++) { if(ypix[scanx].rgbtBlue == 79 && ypix[scanx].rgbtGreen==162 && ypix[scanx].rgbtRed ==223) { MessageBox(0,"Gefunden","test1",MB_OK); } } } bmp->FreeImage(); delete bmp; delete canvas; } Sleep(10); }
Scheint zu funtionieren, vielen dank. Wenn jemand noch irgendwelche vorschläge hat, bitte posten.