Floodfill im gesamten Bild - BrushCopy
-
*Jetzt_bin_ich_geleidigt*. Zwar nur noch aus Kompatibilitätsgründen vorhanden, aber dafür sehr schnell: BrushCopy. Das klappt auch einwandfrei. Der Haken: Esbringt immer nur weiß zustande. Hab checkhalber Pen->Color auch direkt in der Function definiert; wie zu erwarten, nützt nichts.
Jetzt will ich nicht einfach so aufgeben, zumal die Methode eben blitzschnell geht. Die Hilfe sagt, es geht, und sie bringt auch ein Beispiel. Ole, der Code ist simpel, also sollte mein Beispiel auch richtig arbeiten. Entdeckt ihr einen Denkfehler oder ist ggf. noch was anderes zu berücksichtigen?
// Ein TColor-Objekt als Farbreferenz RefColor = Image->Canvas->Pixels[X][Y]; // Dann das Bild im Image auf sich selbst kopieren Image->Canvas->BrushCopy(Image->ClientRect, Image->Picture->Bitmap, Image->ClientRect, RefColor);
-
Hab checkhalber Pen->Color auch direkt in der Function definiert
Du solltest natürlich Image->Canvas->Brush->Color ändern!
-
Au ja. Die Hilfe sagt Pinsel, und ich hab Pen verstanden. Pen und Brush sowie beide Style's und Color's sind vor Ort bekannt. Mit ShowMessage überprüft. Die Werte zu ändern ändert überhaupt nichts am Ergebnis.
Sieht so aus, als ob es wirklich nicht mehr unterstützt wird, und der Default wär clWhite. Anders kann ich mir das jetzt nicht erklären. Wenn nicht zufällig jemand weiß, wie man da doch noch dran kommen könnte, ist wohl nichts mehr zu machen.
Ich kann es nur so lösen:
RefColor = Image->Canvas->Pixels[X][Y]; for (int Y=0;Y<Image->Picture->Bitmap->Height;Y++) { for (int X=0;X<Image->Picture->Bitmap->Width;X++) { Image->Canvas->FloodFill(X, Y, RefColor, fsSurface); } }
Das ist entsprechend langsam. Mit Pixels[X][Y] geht es aber noch langsamer. Gibt es eine schnellere Methode, um alle Vorkommen der Referenz-Farbe ändern zu können? Hab ausgiebig mit ScanLine expirimentiert, bekomm aber keine Syntax zusammen (meine alte Krankheit
).
-
Pen und Brush sowie beide Style's und Color's sind vor Ort bekannt
Wie kann man so einen Müll schreiben?! Ehrlich mal! Drück dich doch einmal so aus, dass dich jeder versteht, Omega. Ich schätze übrigens nicht, dass es an der Funktion BrushCopy() liegt, sondern irgendwie an dir. Irgendwas musst du falsch machen.
-
Direkt vor dem Ausführungscode
Image->Canvas->BrushCopy(Image->ClientRect, Image->Picture->Bitmap,
Image->ClientRect, RefColor);
Hab ich in einer MessageBox Image->Canvas->Pen->Color, Image->Canvas->Brush->Color, Image->Canvas->Pen->Style und Image->Canvas->Brush->Style abgefragt. Alle Werte werden ausgegeben, sind also "vor Ort" bekannt. - Sorry, ich denk vielleicht zu bildhaft.Klar liegt es an mir, davon geh ich aus. Ich weiß aber echt nicht mehr, wo ich noch suchen könnte. Es scheint alles zu stimmen. Trotzdem benutzt BrushCopy nicht die aktuelle Pinselfarbe.
-
Solage du in Bitmap nichts geladen hast bekommst du Probleme. Bitmap und Canvas haben in diesem Zustand keine übereinstimmende "Farbe". Hole dir die Referenzfarbe über Bitmap->Canvas->Pixels[x][y] und nicht über Image->Canvas->Pixels !!!
[ Dieser Beitrag wurde am 14.02.2003 um 18:24 Uhr von etechniker editiert. ]
-
...und das Argument war so vielversprechend...
RefColor = Image->Picture->Bitmap->Canvas->Pixels[X][Y]; Image->Picture->Bitmap->Canvas->Brush->Color = clRed; Image->Canvas->BrushCopy(Image->ClientRect, Image->Picture->Bitmap, Image->ClientRect, RefColor);
Wober die Referenzfarbe so oder so OK geht. In beiden Fällen wird die Farbe am Cursor im ganzen Bild ausgetauscht; nur eben in weiß statt in meine Wahlfarbe. Wenn ich nur 'ne Möglichkeit wüßte, die Spur zu verfolgen. Wo nimmt der die Info "clWhite" her? Noch näher kann ich ihm doch nicht befehlen, jetzt mal die Farbe clRed zu nehmen.
-
Der Pinsel(Brush) der Zeichenfläche muss gesetzt werden, das war schon richtig vorher...
Image->Picture->Bitmap->Width = irgendwas;
Image->Picture->Bitmap->Height =irgendwas;
RefColor = Image->Picture->Bitmap->Canvas->Pixels[X][Y];
Image->Canvas->Brush->Color = clRed;
Image->Canvas->BrushCopy(Image->ClientRect, Image->Picture->Bitmap,
Image->ClientRect, RefColor);
-
War alles noch zu wenig. Ich muß übereine Speicherbitmap gehen. Jetzt klappt es einwandfrei und... ist feuerschnell *freu*.
Graphics::TBitmap *pBitmap = new Graphics::TBitmap; pBitmap->Width = Image->Picture->Width; pBitmap->Height = Image->Picture->Height; pBitmap->Assign(Image->Picture); RefColor = Image->Picture->Bitmap->Canvas->Pixels[X][Y]; Image->Picture->Bitmap->Canvas->Brush->Color = clRed; Image->Canvas->Brush->Color = clRed; Image->Canvas->BrushCopy(Image->ClientRect, pBitmap, pBitmap->Canvas->ClipRect, RefColor); delete pBitmap; pBitmap = NULL;
Für den Hinweis dank ich dir nochmal sehr. Ich wußte nicht, daß da ein entscheidender Unterschied besteht. Wieder was wichtiges gelernt und... *Sieg*