Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   FreePascal (https://www.delphipraxis.net/74-freepascal/)
-   -   FreePascal Canvas.FloodFill unter Linux (https://www.delphipraxis.net/191117-canvas-floodfill-unter-linux.html)

Benedikt Magnus 9. Dez 2016 20:45


Canvas.FloodFill unter Linux
 
Hallo zusammen,

zu meinem Bedauern musste ich feststellen, dass FloodFill zum Einfärben von Flächen auf einem Canvas anscheinend nur unter Windows funktioniert...
Nach einigem Suchen und jeder Menge Ausprobieren habe ich aber nichts Brauchbares als Ersatz gefunden.

Kann mir daher jemand sagen, wie ich es schaffe, unter Linux ein PNG zu laden, eine Fläche gleicher Farbe einzufärben, ein zweites, teilweise transparentes, PNG drüberzuzeichnen und das Ganze anschließend wieder abzuspeichern?

Ich bin für jede Hilfe dankbar!

Delphi-Laie 9. Dez 2016 21:21

AW: Cavas.FloodFill unter Linux
 
Zitat:

Zitat von Benedikt Magnus (Beitrag 1355806)
Ich bin für jede Hilfe dankbar!

Korrigiere bitte mal den Fehler in Deiner Überschrift, um späteres Suchen zu erleichtern.

Benedikt Magnus 9. Dez 2016 21:54

AW: Canvas.FloodFill unter Linux
 
Danke für den Hinweis. Ich habe es korrigiert.

himitsu 9. Dez 2016 22:22

AW: Canvas.FloodFill unter Linux
 
Linux und Delphi?
Ich glaub das ging vor paar Jahrzehnten zuletzt.

Bernhard Geyer 9. Dez 2016 22:40

AW: Canvas.FloodFill unter Linux
 
Zitat:

Zitat von himitsu (Beitrag 1355813)
Linux und Delphi?
Ich glaub das ging vor paar Jahrzehnten zuletzt.

Wüsste jetzt nicht wieso FreePascal das nicht mehr Linux unterstützen sollte

himitsu 9. Dez 2016 23:38

AW: Canvas.FloodFill unter Linux
 
Ahhhhhhh, das da oben hatte ich glatt übersehn ... hatte mich schon bissl gewundert. :oops:
(nicht dass er heimlich das nächste Delphi nutzt)

Ich denk mal unter Windows wird TCanvas dort auch auf Microsofts GDI+ aufsetzen
und unter Linux demnach irgendwas Anderes verwenden.

Aber ich bin mir fast sicher, dass diese Grafik-Lib auch FloodFill kann,
sonst hätte man jetzt denken können, dass es das dort eventuell nicht gäbe. :gruebel:

Benedikt Magnus 9. Dez 2016 23:48

AW: Canvas.FloodFill unter Linux
 
Okay, habe es jetzt mit ImageMagick gelöst. Da die API leider nicht recht funktionieren wollte, erstellt mein Programm jetzt anhand der Daten ein Shellskript mit den nötigen Kommandos... :lol:
Das ist nicht unbedingt sehr performant (trotz kleiner RAM-Disk als Tempverzeichnis), aber es funktioniert.

Weiß jemand, wie ich über die Kommandozeile ImageMagick anweisen kann, mehrere FloodFills auf ein Bild gleichzeitig anzuwenden? Das könnte die Sache noch vereinfachen.

Benedikt Magnus 9. Dez 2016 23:50

AW: Canvas.FloodFill unter Linux
 
Wenn man unter Linux Canvas.FloodFill anwendet, auf die gleiche Weise wie unter Windows, passiert einfach gar nichts... x)

Harry Stahl 10. Dez 2016 09:04

AW: Canvas.FloodFill unter Linux
 
Das liegt daran, dass unter Linux dafür keine Umsetzung existiert.

Unter Windows wird die Windows-Funktion Floodfill aufgerufen (unter MAC gibt es eine eigene FloodFillBitmap-Implementation), unter Linux landest Du hier:

Delphi-Quellcode:
function TWidgetSet.FloodFill(DC: HDC; X, Y: Integer;
  Color: TGraphicsColor;
  FillStyle: TGraphicsFillStyle;
  Brush: HBRUSH): Boolean;
begin
  Result := false;
end;
Man muss also unter Linux was eigenes machen.

Ich bin gerade dabei, mein PixPower mit Lazarus auch für Linux (und MAC) umzusetzen. Die Floodfill-Lösung für Linux steht auch noch auf meiner ToDo-Liste. Werde auf jeden Fall eine eigene Lösung auf Bitmap-Ebene machen, da ich hier mit TLazIntfImage (quasi dem Standard-Lazarus-Bitmap) arbeite, da möchte ich nicht extra eine weitere externe Bibliothek einbinden.

Weiß nicht wie eilig es ist, kann Dir meine Lösung dann gerne zur Verfügung stellen (werde ich wohl in den nächsten Tagen machen).

Benedikt Magnus 10. Dez 2016 09:33

AW: Canvas.FloodFill unter Linux
 
Zitat:

Zitat von Harry Stahl (Beitrag 1355819)
Das liegt daran, dass unter Linux dafür keine Umsetzung existiert.

Gibt es dafür einen bestimmten Grund oder hat sich dessen einfach bisher noch niemand angenommen?

Zitat:

Zitat von Harry Stahl (Beitrag 1355819)
Weiß nicht wie eilig es ist, kann Dir meine Lösung dann gerne zur Verfügung stellen (werde ich wohl in den nächsten Tagen machen).

Das wäre klasse! Eilig ist es nicht, daher vielen, vielen Dank! :thumb:

Denn ImageMagick braucht derzeit in meiner virtuellen Maschine (zwei Kerne) für fünf Bilder (1699x911) á hundert FloodFills 95 Sekunden. Geplant waren rund fünfzig Bilder jede Stunde, was dann knapp 16 Minuten wären, und der Server kann ja wohl kaum ein Viertel seiner Zeit mit der Berechnung dieser blöden Bilder verbringen... :-D

Benedikt Magnus 10. Dez 2016 10:40

AW: Canvas.FloodFill unter Linux
 
Okay, ich habe nun entdeckt, dass es fcl-image gibt und sogar, wie man es richtig anwendet.
Nach einigem Codeumbau läuft dort nun auch das FloodFill -> Die fünf Bilder von oben in unter zwei Sekunden. :-D

Daher ist mein Problem nun gelöst. Dennoch Harry vielen Dank für dein Angebot!

Harry Stahl 10. Dez 2016 10:55

AW: Canvas.FloodFill unter Linux
 
OK, habe mich noch gar nicht so intensiv mit FPCanvas befasst, sehe nun aber, dass da auch eine FloodFill-Funktion gegeben ist.

Und die funktioniert auch unter Linux?

Dann könnte ich mir eine eigene Implementation evtl. ersparen (wird ja wohl irgendeine Konvertierungsmöglichkeit zwischen TBitmap / TLazIntfImage / FPImage bestehen).

Benedikt Magnus 10. Dez 2016 11:50

AW: Canvas.FloodFill unter Linux
 
Oh ja, die funktioniert einwandfrei unter Linux!

Mit FPCanvas konnte ich soweit alles machen wie mit dem Standardcanvas auch (lediglich die Initialisierung ist etwas umständlich). Nur für das Zeichnen eines transparenten PNGs aufs Canvas musste ich eine kleine Anpassung vornehmen, aber auch das funktioniert jetzt prima.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:17 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