AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Füll-Werkzeug für Pixelprogramm
Thema durchsuchen
Ansicht
Themen-Optionen

Füll-Werkzeug für Pixelprogramm

Ein Thema von milos · begonnen am 3. Feb 2014 · letzter Beitrag vom 4. Feb 2014
Antwort Antwort
Seite 2 von 2     12   
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#11

AW: Füll-Werkzeug für Pixelprogramm

  Alt 4. Feb 2014, 10:08
Da es hier ja um einen Bildeditor geht, nicht um Animationen bei denen jedes Frame etwas neu gefüllt werden muss, wird der triviale Ansatz locker reichen. Man sollte nur überlegen, ob man nicht lieber mit Scanline statt Pixels[] da dran geht (vorausgesetzt man arbeitet mit einem TBitmap, was hier glaube ich nichtmals der Fall ist).
Ohne die Zeilen-Optimierung muss man ggf. nur aufpassen, dass man ab gewissen Bildgrößen keinen Stacküberlauf bekommt. Da ginge im Zweifel als Lösung auch noch die iterative Variante mit selbst verwaltetem Stapel.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#12

AW: Füll-Werkzeug für Pixelprogramm

  Alt 4. Feb 2014, 11:31
Wie wäre es denn mit dieser Funktion?
Delphi-Quellcode:
procedure FloodFill( Canvas : TCanvas; x, y : Integer; NewColor : TColor );
var
  LCurrentColor : TColor;
begin
  Canvas.Brush.Color := NewColor;
  Canvas.Brush.Style := bsSolid;
  LCurrentColor := Canvas.Pixels[x, y];
  Canvas.FloodFill( x, y, LCurrentColor, fsSurface );
end;

...
FloodFill( MyBitmap.Canvas, 23, 54, clRed );
...
Delphi-Referenz durchsuchenTCanvas.FloodFill
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#13

AW: Füll-Werkzeug für Pixelprogramm

  Alt 4. Feb 2014, 13:36
Die Rekursion kann man vergessen (bringt regelmäßig Stackoverflow).

BTW, wie würde denn ein Algorithmus für fsBorder aussehen?

fsSurface ist ja dieser:

Delphi-Quellcode:
procedure TFloodFill.FloodFill4(X, Y: integer);
var
  P: TPoint;
  Stack: TPointStack;
begin
  Stack := TPointStack.Create;
  try
    Stack.Push(Point(X, Y));
    while not Stack.Empty do
    begin
      P := Stack.Pop;
      if IsCurrentColor(P.X, P.Y) then // OldColor;
      begin
        FPixels[P.X, P.Y] := FBrushColor; // NewColor;
        Stack.Push(Point(P.X, P.Y + 1));
        Stack.Push(Point(P.X, P.Y - 1));
        Stack.Push(Point(P.X + 1, P.Y));
        Stack.Push(Point(P.X - 1, P.Y));
      end;
    end;
  finally
    Stack.Free;
  end;
end;
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.477 Beiträge
 
Delphi 12 Athens
 
#14

AW: Füll-Werkzeug für Pixelprogramm

  Alt 4. Feb 2014, 13:39
Gibt viele nette Sachen im Internet zu dem Thema mit Quellcode und Erklärung:
QuickFill-An-efficient-flood-fill-algorithm
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#15

AW: Füll-Werkzeug für Pixelprogramm

  Alt 4. Feb 2014, 14:13
Die Rekursion kann man vergessen (bringt regelmäßig Stackoverflow).
So pauschal stimmt das einfach nicht. Fläche klein genug oder Stack groß genug, und schon ist alles gut. (Ja, mit einem eigenen Stack ist man fast immer besser beraten, aber dennoch ist die Aussage faktisch falsch.)

Zitat:
BTW, wie würde denn ein Algorithmus für fsBorder aussehen?
Ich vermute du meinst die Unterscheidung zwischen "fülle diese einfarbige Fläche" und "fülle alles was von einem Rand mit Farbe X umgeben ist". Dann wäre "fsBorder":

Delphi-Quellcode:
procedure TFloodFill.FloodFill4(X, Y: integer);
var
  P: TPoint;
  Stack: TPointStack;
begin
  Stack := TPointStack.Create;
  try
    Stack.Push(Point(X, Y));
    while not Stack.Empty do
    begin
      P := Stack.Pop;
      if not IsBorderColor(P.X, P.Y) then
      begin
        FPixels[P.X, P.Y] := FBrushColor;
        Stack.Push(Point(P.X, P.Y + 1));
        Stack.Push(Point(P.X, P.Y - 1));
        Stack.Push(Point(P.X + 1, P.Y));
        Stack.Push(Point(P.X - 1, P.Y));
      end;
    end;
  finally
    Stack.Free;
  end;
end;
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#16

AW: Füll-Werkzeug für Pixelprogramm

  Alt 4. Feb 2014, 15:41
Ich hab gestern meinen alten Labyrinth Code ausgepackt und die Entstehung visualisiert, da ich selbst sehen wollte was da vor sich geht. Es ist ja nicht das Fill Problem, aber ich denke es ist im Grunde ein ähnliches Problem, da sich auch bei Fill die Wege oft trennen. Dabei habe ich auch den Stack visualisiert (rote Punkte), und war letztendlich selbst überrascht, wie viele Werte es dann doch sind. Ist aber auch richtig, denn bei dem Drang nach vorne wird immer dann eine Position auf Stack gelegt, wenn es zu dem Zeitpunkt mehr als eine Möglichkeit gab. Einiges erledigt sich im Laufe der weiteren Berechnung, aber jede Punkt wird noch mal besucht und kontrolliert.

Das Beispiel zeigt eine verzögerte Berechnung eines Labyrinths und wo überall und wie viele Werte auf Stack gelegt wurde. Interessant zu sehen, falls man den Stack bei der Arbeit zusehen möchte.
Angehängte Dateien
Dateityp: zip Project1.zip (207,7 KB, 9x aufgerufen)
  Mit Zitat antworten Zitat
Bjoerk

Registriert seit: 28. Feb 2011
Ort: Mannheim
1.384 Beiträge
 
Delphi 10.4 Sydney
 
#17

AW: Füll-Werkzeug für Pixelprogramm

  Alt 4. Feb 2014, 16:44
Ok. Logo. Thanx @ Medium. Bin allerdings schon der Auffassung, daß das hier der Klassiker für einen Stack ist? Hatte gestern Tests mit 200 x 200 Pixel Fläche durchgeführt. Kam bei jedem 3. Durchlauf ein Stackoverflow? Den Stack hochstellen hab ich noch nie gemacht?
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#18

AW: Füll-Werkzeug für Pixelprogramm

  Alt 4. Feb 2014, 16:57
Ok. Logo. Thanx @ Medium. Bin allerdings schon der Auffassung, daß das hier der Klassiker für einen Stack ist? Hatte gestern Tests mit 200 x 200 Pixel Fläche durchgeführt. Kam bei jedem 3. Durchlauf ein Stackoverflow? Den Stack hochstellen hab ich noch nie gemacht?
Dieses Schwachsinnsfüllen macht man ja auch nicht mit 200x200 pixeln, sondern mit so 10x10 und in der Schule/Uni um mal was über Stacks und Rekursion zu lernen.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz