Problem mit FloodFill
-
Hallo zusammen,
mich plagt ein kleines Problem mit der Funktion FloodFill.
Ich hoffe ihr könnt mir helfen.Ich habe eine Landkarte im Bitmap-Format, schwarze Landesgrenzen, weißer Hintergrund. ich möchte gerne durch die Karte gehen und die Länder zählen. Dazu habe ich mir überlegt, durch alle Pixel zu wandern und wenn die Farbe weiß ist, mittels FloodFill das Land einzufärben und hochzuzählen.
Soviel die Theorie.So habe ich es versucht umzusetzen:
void __fastcall TForm1::Button1Click(TObject *Sender) { int anzahlLaender = 0; Canvas->Brush->Color = clBlue; Canvas->Pen->Color = clRed; for (int x=0; x<Bild->Width; x++) { for (int y=0; y<Bild->Height; y++) { if (Bild->Canvas->Pixels[x][y] == 16777215) { Bild->Canvas->FloodFill(x,y,clBlack,fsSurface); anzahlLaender++; } } } ShowMessage(count); }
Es passiert... nichts (sichtbares). Eine Einfärbung kann ich nicht erkennen. Die Länderzahl schnellt hingegen in exorbitante Höhen (irgendwas um die 490.000). Es sieht also so aus, als ob er jedes Pixel einzeln durchgeht und hochzählt... FloodFill hingegen macht sowohl als fsSurface und fsBorder nichts.
Kann es am Bildformat liegen? Oder doch ein Denkfehler?
Weder Suche noch Hilfe helfen mir hier wirklich weiter...Danke für die Hilfe,
Oliver
-
Hallo,
auf den ersten Blick fällt mir auf, dass du Canvas eine Farbe zuweist und dann mit Bild->Canvas versucht FlooFill anzuwenden.
Canvas allein heisst -> Form1->Canvas und nicht Bild->Canvas !!!
Ändere das mal und probiers nochmal!
Gruß
Hawk
-
Hallo und danke für den ersten Versuch.
Doch leider war es ds nicht. Gleiches Ergebnis. Ich habe mal testweise das FloodFill durch ein stumpfes Färben eines einfachen Pixels ausgetauscht, um zu sehen, ob es am Bildformat liegt, was kein Malen zulässt. Folgendes färbt die Karte komplett ein (so, wie ich es mir mit FloodFill vorgestellt hätte). Allerdings löst das das Problem nicht, nämlich das Zählen der Länder.
void __fastcall TForm1::Button1Click(TObject *Sender) { int anzahlLaender = 0; Bild->Canvas->Brush->Color = clBlue; Bild->Canvas->Pen->Color = clRed; for (int x=0; x<Bild->Width; x++) { for (int y=0; y<Bild->Height; y++) { if (Bild->Canvas->Pixels[x][y] == 16777215) { //Bild->Canvas->FloodFill(x,y,clBlack,fsSurface); Bild->Canvas->Pixels[x][y] = clRed; anzahlLaender++; } } } ShowMessage(anzahlLaender); }
-
Was ist denn Bild? Ist das ein TBitmap oder ein TImage???
Denn es ist ein Unterschied: wenn Bild ein TBitmap, dann ist Bild->Canvas OK!
Aber wenn Bild ein TImage, dann gilt:
Bild->Picture->Bitmap->Canvas->FloodFill(..);
Gruß Hawk
-
Hallo Hawk,
du hast mir echt geholfen. Danke.
ich weiss zwar nicht, warum ich mitBild->Canvas->Pixels[][]
zeichnen durfte und mit FloodFill nicht, aber nach der Änderung in
Bild->Picture->Bitmap->...
klappt es.
Zur Vollständigkeit:
void __fastcall TForm1::Button1Click(TObject *Sender) { int anzahlLaender = 0; Bild->Picture->Bitmap->Canvas->Brush->Color = clBlue; Bild->Picture->Bitmap->Canvas->Pen->Color = clRed; for (int x=0; x<Bild->Width; x++) { for (int y=0; y<Bild->Height; y++) { if (Bild->Picture->Bitmap->Canvas->Pixels[x][y] == 16777215) { Bild->Picture->Bitmap->Canvas->FloodFill(x,y,16777215,fsSurface); //Canvas->Pixels[x][y] = clRed; anzahlLaender++; } } } ShowMessage(anzahlLaender); }