Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi TCanvas.FloodFill funktioniert nicht, wie erwartet (https://www.delphipraxis.net/103417-tcanvas-floodfill-funktioniert-nicht-wie-erwartet.html)

s-off 15. Nov 2007 14:19


TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Hallo,

ich zeichne ein RoundRect; dieses wird sofort mit der in Brush.Color definierten Farbe ausgefüllt.
Anschließend möchte ich das RoundRect mit einer anderen Farbe ausfüllen; dazu benutze ich folgenden Code, der allerdings nicht funktioniert:
Delphi-Quellcode:
      //Normales RoundRect zeichnen (Hintergrundfarbe weiß)
      MyCanvas.Brush.Color := clWhite;
      MyCanvas.RoundRect(iX1, iY1, iX + iX2, iY + iY2, iRundung, iRundung);

      //Irgendwann später dann FloodFill mit rot drüber
      MyCanvas.Brush.Color := clRed;
      MyCanvas.FloodFill(iX1 + 1, iY1 + 1, MyCanvas.Pixels[iX1 + 1, iY1 + 1], fsSurface);
Hier wird ein Roundrect gezeichnet. Der Rahmen ist schwarz, die 'Füllung' weiß.
FloodFill soll dieses RoundRect nun rot ausfüllen. Der Punkt 'iX1 + 1, iY1 + 1' liegt definitiv innerhalb des RoundRect und hat die Farbe 'weiß'. Durch fsSurface sollte nun eigentlich solange in alle Richtungen mit rot gemalt werden, bis eine andere Farbe als 'weiß' 'im Wege' steht - es passiert aber nichts - der komplette Hintergrund des RoundRect bleibt weiß.

Was mache ich falsch?

Reinhard Kern 15. Nov 2007 14:50

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Zitat:

Zitat von s-off
Der Punkt 'iX1 + 1, iY1 + 1' liegt definitiv innerhalb des RoundRect und hat die Farbe 'weiß'.
Was mache ich falsch?

Hallo,

wenn dieser Punkt innerhalb liegt, ist es kein RoundRect - höchstens eines, das zu einem normalen Rechteck entartet ist. Wenn das Eck abgerundet ist, müsste der Punkt auf dem Rand liegen oder ausserhalb.

Gruss Reinhard

Progman 15. Nov 2007 14:55

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
nimm mal statt +1 +10 oder mehr, damit du über die Rundung kommst.

s-off 15. Nov 2007 16:19

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Ach Du meine F*esse :?
Das klingt natürlich vollkommen einleuchtend! Werde es gleich mal ausprobieren!

s-off 15. Nov 2007 16:38

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Hallo nochmal,

leider hat das auch nicht geholfen.

Habe mir nun mal an dem zu prüfenden Punkt eine Linie ausgegeben, um zu sehen, ob er inerhalb des RoundRects liegt - ist nun bei diesem Beispiel der Fall.
Leider bleibt der Inhalt des RoundRects noch immer weiß - zum verzweifeln - *heul* :(

Delphi-Quellcode:
//Normales RoundRect zeichnen (Hintergrundfarbe weiß)
MyCanvas.Brush.Color := clNone;
MyCanvas.RoundRect(iX1, iY1, iX1 + iX2, iY1 + iY2, iRundung, iRundung);

//Danach FloodFill rot drüber
MyCanvas.Brush.Color := clRed;
     
//liegt Punkt im RoundRect?
//      MyCanvas.MoveTo(iX1 + 260, iY1 + 20);
//      MyCanvas.LineTo(iX1 + 260 + 30, iY1 + 20);

MyCanvas.FloodFill(iX1 + 260, iY1 + 20, MyCanvas.Pixels[iX1 + 260, iY1 + 20], fsSurface);

Progman 15. Nov 2007 16:41

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Du musst vorher Canvas.Brush.Color auf die Farbe setzen, mit der gefüllt werden soll (soweit ich das in Erinnerung habe)

s-off 15. Nov 2007 19:29

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Zitat:

Zitat von Progman
Du musst vorher Canvas.Brush.Color auf die Farbe setzen, mit der gefüllt werden soll (soweit ich das in Erinnerung habe)

Das mache ich doch in Zeile 6 - oder meinst Du etwas anderes?

Progman 15. Nov 2007 19:42

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Sorry, hab ich gar nicht gesehen...
Aber was ist oC.Pixels[iX1 + 260, iY1 + 20] ?
An dieser Stelle sollte die Farbe hin, die durch Brush.Color ersetzt wird. Da müsste auch Canvas.Pixels[..,..] stehen.

s-off 15. Nov 2007 19:47

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Upsi,

oC ist der eigentliche Name des Canvas.
Habe es nur in MyCanvas geändert, um das Ganze hier deutlicher zu machen, und um nicht die Variablendeklaration hier mit posten zu müssen. Im Quellcode ist alles auf oC. Diese eine Stelle hatte ich beim reinkopieren hier vergessen, zu ändern.

Das seltsame ist, dass es in einem einfachen nachgebauten Programm funktioniert, wenn ich auf das Canvas einer TForm male.

Bei meinem Problem handelt es sich allerdings um eine Druckroutine in ein PDF-Dokument. Hmm, vielleicht liegt dort der Hase begraben.

Progman 15. Nov 2007 19:51

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
wäre ja durchaus möglich, dass dieser Canvas kein FloodFill unterstützt?
Denn ansonsten ist kein Fehler im Code.

s-off 15. Nov 2007 20:09

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Zitat:

Zitat von Progman
wäre ja durchaus möglich, dass dieser Canvas kein FloodFill unterstützt?
Denn ansonsten ist kein Fehler im Code.

Ist Canvas nicht = Canvas?
Ich meine ein direkt von TCanvas abstammendes Objekt muss doch sämtliche Methoden von TCanvas unterstützen, oder?
Das Canvas habe ich ja selber instanziiert und übergebe es dann an die PDF-Engine, die mir daraus ein PDF-Dokument bastelt.

Progman 15. Nov 2007 20:20

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
naja, wie gesagt, auf Canvas von TForm, TBitmap, TPaintBox etc. funktioniert das ja auch. Warum es bei deinem Canvas nicht klappt, ist mir auch ein Rätsel.

s-off 15. Nov 2007 20:27

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Zitat:

Zitat von Progman
naja, wie gesagt, auf Canvas von TForm, TBitmap, TPaintBox etc. funktioniert das ja auch. Warum es bei deinem Canvas nicht klappt, ist mir auch ein Rätsel.

Mir auch - und ich hasse sie, wenn sie ungelöst bleiben - also jetzt Feierabend machen und morgen wieder ran :zwinker:

Danke für Deine Unterstützung.
Vielleicht fällt ja jemandem über Nacht noch etwas schlaues zum Thema ein :stupid:

tierramadre 12. Jan 2008 11:18

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
:wink: Hallo,

habe das gleiche Problem.
Schein wohl irgendwie am Canvas von TMetaFile zu liegen. Bei der Ausgabe in andere Canvas funktioniert mein FloodFill ohnen Probleme.
Hast Du Dein Problem inzwischen gelöst? Wenn ja wäre ich über eine kurze Info dankbar.

s-off 12. Jan 2008 11:54

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Hallo,

nein, ich konnte das Problem mit besagtem Canvas leider nicht lösen; es scheint da tatsächlich Unterschiede zu geben, so dass Canvas nicht gleich Canvas ist :?

Neutral General 12. Jan 2008 12:05

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Hi,

Welches Handle weißt du denn deinem Canvas zu?
Also ich hab das nachgebaut (halt nicht mit pdf, aber ansonsten gleich) und es funktioniert (wie du ja auch schon gesagt hast...

Gruß
Neutral General

s-off 12. Jan 2008 12:19

Re: TCanvas.FloodFill funktioniert nicht, wie erwartet
 
Mir ist gerade noch eingefallen, dass der Autor dieses PDF-Canvas mir auch eine Begründung gab, warum das nicht funktionierte; moment, ich suche mal...

So, habs gefunden - hier die Antwort:
Zitat:

Floodfill is not supported. I recommend to print on a bitmap (TBitmap.Canvas) and export the bitmap data.
Floodfill can only work on a bitmap surface, PDF is vector based, it would not work.
Damit war die Sache dann für mich auch erledigt.


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