![]() |
Delphi-Version: 10 Seattle
Radieren/Freilegen von Bildern mit FMX
Hallo Leute,
wie sollte ich vorgehen um folgendes Ziel zu erreichen. Ich möchte ein Bild farbig überdecken. Beim Überfahren des farbig überdeckten Bildes soll das Bild an den überfahrenen Positionen sichtbar werden. Wenn dass Bild zu einem bestimmten Prozentsatz freigelegt ist, soll das Bild komplett freigelegt werden. Nun stellen sich mir folgende Fragen: Mit welchen Komponenten wird das Ganze realisiert? Welche Vorgehensweise ist die beste, welche die einfachste? Soll z.B. ein TImage benutzt und dieses mit dem eigenen Canvas übermalt werden oder ist es sinnvoller zwei Bitmaps übereinander zu legen oder doch eine Paint-Komponente auf der man radieren kann? Wie wird gewährleistet, dass beim Neuzeichnen die bereits freigelegten Bereiche nicht wieder übermalt werden? Muss eine Matrix angelegt werden, in der die bereits freigelegten Bereich gespeichert werden? Oder sollte ich ganz anders vorgehen? Ich bitte um Input. Gruß |
AW: Radieren/Freilegen von Bildern mit FMX
|
AW: Radieren/Freilegen von Bildern mit FMX
Danke für den Link mkinzler.
Allerdings sehe ich die Lösung nicht darin. Ich möchte das Bild nicht verformen, sondern freilegen oder soll das heißen, dass ich mein Vorhaben nicht mit den in Delphi vorhandenen FMX-Komponenten umsetzen kann, sondern unbedingt die Graphic32 Bibliothek dazu benötige? Gruß |
AW: Radieren/Freilegen von Bildern mit FMX
Nein das geht auch mit den in Delphi vorhandenen Mitteln.
Hast du denn schon mal was probiert? Deine Gedanken oben klingen ja grundlegend gar nicht so schlecht. |
AW: Radieren/Freilegen von Bildern mit FMX
Ich habe ein Image mit Bild benutzt und eine schwarze Zeichenoberfläche darüber gelegt.
Probleme kommen auf beim Freilegen der bereits besuchten Flächen, da beim Neuzeichnen natürlich die ganze Zeichenfläche neu gezeichnet wird. Daher meine Überlegung, ob mein Ansatz überhaupt der Richtige ist. |
AW: Radieren/Freilegen von Bildern mit FMX
Du bist ja äußerst sparsam mit Informationen ...
Interessant wäre z. B., wie groß die Bilder sind und was genau dein Problem ist (Flackern beim Refresh?). Ich würde es so machen: Die schwarze Fläche ins Image, das aufzudeckende Bild in ein Bitmap. Dann im MouseMove-Event abfragen, ob die linke Maustaste gedrückt ist und falls das der Fall ist, mit CopyRect einen Block aus dem Hintergrundbild in das Image kopieren und danach einen Refresh auslösen. Nicht vergessen, beim Image doublebuffered auf true zu stellen. Warum ein Block? Weil du wahrscheinlich keine kontinuierliche Änderung der Mauskoordinaten mitbekommst und ansonsten auch ziemlich viel 'kratzen' musst, wenn du das nur pixelweise machst. Das ist jetzt aus Sicht der VCL geschrieben, aber das Prinzip müsste für FMX auch gelten. |
AW: Radieren/Freilegen von Bildern mit FMX
Hallo striderx,
danke für deine Antwort. Ich habe extra die Informationen so gering wie möglich gehalten, damit keiner mit gegebenen Situationen arbeitet, sondern frisch seine Ideen, ohne Suggestion, rein bringt. Zu meinem Problem: Ich versuche momentan einfach die besuchten Pixel andersfarbig darzustellen. Jedoch werden diese beim Neuzeichnen der schwarzen Oberfläche immer wieder gelöscht, logisch da neugezeichnet wird. Was heißt "schwarze Fläche ins Image"? ![]() ![]() Wie du schon selber sagst, gilt das für die VCL. Allerdings benötige ich das Ganze in oder mit FMX. |
AW: Radieren/Freilegen von Bildern mit FMX
>>Jedoch werden diese beim Neuzeichnen der schwarzen Oberfläche immer wieder gelöscht, logisch da neugezeichnet wird.<<
Deswegen solltst du die schwarze Fläche erst ändern und dann einen Refresh auslösen. >>Was heißt "schwarze Fläche ins Image"? << Dass das im Image angezeigte Bild am Anfang komplett schwarz ist. >> ![]() Könnte sein, dass das unter FMX CopyFromBitmap ist. >> ![]() Das ist in der VCL auch keine Eigenschaft von tImage. Aber wahrscheinlich brauchst du das eh nicht, weil FMX m. W. Hardware-Beschlenigung nutzt. |
AW: Radieren/Freilegen von Bildern mit FMX
Zitat:
Schwarzes Bild(jpg, bmp, gif) ins Image laden? Meinst du ein schwarzes z.B. Jpeg erstellen und dann ins Image laden? CopyfromBitmap sehe ich mir an. Damit kann man einen Bereich selektieren. Danke. Könnte man nicht die Transparenz des Image/Bitmap/geladenen Bildes beim Überfahren (z.b. mit der Maus) von Transparent auf Nicht Transparent wechseln ohne das gesamte Image/Bitmap/Bild nicht transparent zu setzen? |
AW: Radieren/Freilegen von Bildern mit FMX
<<Was macht das für einen Unterschied. Beim erneuten Refresh wird wieder alles neugezeichnet.<<
Das ist der entscheidende Unterschied. Neu gezeichnet wird dann eben nicht ein komplett schwarzes Bild sondern ein Bild, auf dem bereits die entsprechenden Stellen freigelegt worden sind. >> Also Zeichenfläche wieder schwarz(Ich arbeite nicht mit MausKlick, sondern mit einem Timer).<< Du schreibst doch selbst, dass du mit der Maus über das Image fährst und die Stellen unter dem Mauszeiger freilegen willst. Was machst du denn in dem Timer-Event? >>Schwarzes Bild(jpg, bmp, gif) ins Image laden? Meinst du ein schwarzes z.B. Jpeg erstellen und dann ins Image laden?<< Nein,. du brauchst kein Bild zu laden. Wie ich gerade gelesen habe, kann man in FMX nicht direkt auf den Canvas eines Images zeichnen. Du brauchst also eine Hilfsbitmap, die du am Anfang schwarz ausmalst. Auf diese Bitmap überträgst du dann jeweils die entsprechenden Stellen des 'bunten' Bildes (es wird also immer bunter) und weist die so geänderte Hilfsbitmap dem Image zu. >>CopyfromBitmap sehe ich mir an. Damit kann man einen Bereich selektieren.<< Und kopieren. >>Könnte man nicht die Transparenz des Image/Bitmap/geladenen Bildes beim Überfahren (z.b. mit der Maus) von Transparent auf Nicht Transparent wechseln ohne das gesamte Image/Bitmap/Bild nicht transparent zu setzen?<< An den Stellen, an denen das 'bunte' Bild rüber kopiert worden ist, ist das schwarze Bild ja zu 100 % transparent. |
AW: Radieren/Freilegen von Bildern mit FMX
Langsam gerät die Sache außer Kontrolle.
Das mit der Maus war in meinem letzten Post lediglich eine Möglichkeit. Ich arbeite mit einem Timer, der in bestimmten Abständen etwas freilegen soll. Das mit der Transparenz war eine Idee, die dieses Hin- und Herkopieren vermeiden/ersetzen sollte, so in dem Sinn Fläche erreicht
Delphi-Quellcode:
.
Image.Teilbereich.Opacity:=1
Werde nun erst einmal CopyfromBitmap ausprobieren und mich später noch einmal melden. Danke bis hierher. |
AW: Radieren/Freilegen von Bildern mit FMX
Hallo,
habe die Methode ![]() Scheint die Richtige zu sein. Zum Testen habe ich ein normales Foto.jpg und ein Schwarzes.jpg verwendet. Erstelle ich allerdings ein Bitmap zur Laufzeit und färbe die Zeichenfläche(Canvas) schwarz, funktioniert es nicht mehr. Die Zeichenfläche bleibt schwarz. Oder muss ich das Bitmap zur Laufzeit erzeugen, schwarz färben, abspeichern und es beim Beenden des Programmes wieder von der Festplatte löschen? Gruß |
AW: Radieren/Freilegen von Bildern mit FMX
Du erstellst beide Bitmaps zur Laufzeit, färbst die eine eimalig Schwarz und lädst in die andere das Foto. Also nix mit speichern.
Dann kopierst du jeweils die entsprechenden Teile aus der Foto-Bitmap in die erste Bitmap und zeigst die so gänderte Bitmap in dem Image an an. Wenn du mal etwa Code zeigen würdest, könnte man dir vielleicht besser helfen. |
AW: Radieren/Freilegen von Bildern mit FMX
Hallo striderx,
ich konnte folgende mir unverständliche Reaktion feststellen: Gegeben: TImage, 3x TButton. Folgender Quelltext:
Delphi-Quellcode:
Folgendes Verhalten in folgender Reihenfolge ist festzustellen:
procedure TForm1.Button1Click(Sender: TObject);
var MyRect: TRectF; begin Image1.Bitmap.Clear($FFFFFF); // initializes the image bitmap canvas Image1.Bitmap := TBitmap.Create(241, 425); Image1.Bitmap.Clear($FFFFFF); // sets the rectangle to be drawn MyRect := TRectF.Create(0, 0, 241, 425); // fills and draws the rectangle on the canvas Image1.Bitmap.Canvas.BeginScene; Image1.Bitmap.Canvas.Fill.Color := TAlphaColors.Black; Image1.Bitmap.Canvas.FillRect(MyRect, 0, 0, AllCorners, 1); Image1.Bitmap.Canvas.EndScene; end; procedure TForm1.Button2Click(Sender: TObject); var MyRect: TRectF; begin Image1.Bitmap.Clear($FFFFFF); // initializes the image bitmap canvas Image1.Bitmap := TBitmap.Create(Image1.Bitmap.Width, Image1.Bitmap.Height); Image1.Bitmap.Clear($FFFFFF); // sets the rectangle to be drawn MyRect := TRectF.Create(0, 0, 241, 425); // fills and draws the rectangle on the canvas Image1.Bitmap.Canvas.BeginScene; Image1.Bitmap.Canvas.Fill.Color := TAlphaColors.Red; Image1.Bitmap.Canvas.FillRect(MyRect, 0, 0, AllCorners, 1); Image1.Bitmap.Canvas.EndScene; end; procedure TForm1.Button3Click(Sender: TObject); var MyRect: TRectF; begin Image1.Bitmap.Clear($FFFFFF); // initializes the image bitmap canvas Image1.Bitmap := TBitmap.Create; Image1.Bitmap.Clear($FFFFFF); // sets the rectangle to be drawn MyRect := TRectF.Create(0, 0, 241, 425); // fills and draws the rectangle on the canvas Image1.Bitmap.Canvas.BeginScene; Image1.Bitmap.Canvas.Fill.Color := TAlphaColors.Green; Image1.Bitmap.Canvas.FillRect(MyRect, 0, 0, AllCorners, 1); Image1.Bitmap.Canvas.EndScene; Betätigen des Button1 = schwarzes Rechteck | O.k. Betätigen des Button2 = rotes Rechteck | O.K Betätigen des Button3 = löschen des roten Rechtecks(richtig wäre grünes Rechteck) Erneutes Betätigen des Button2 = keine sichtbare Reaktion Erneutes Betätigen des Button1 = schwarzes Rechteck |O.k. Während das schwarze Rechteck jederzeit aufgerufen werden kann, wird das rote Rechteck nur gezeichnet, wenn vorher nicht Button3 betätigt wurde. Hat jemand eine Idee, aus welchem Grund diese Verhalten auftritt? Konnte man früher in Delphi die Komponenten nicht Positionieren, also z.B. 30px vom Rand, nächste Komponente 30px von erster Komponente usw.? Gruß |
AW: Radieren/Freilegen von Bildern mit FMX
Wie gesagt, mit FMX habe ich keine großen Erfahrungen, aber da sich anscheinend sonst keiner rührt ...
erst mal aufräumen:
Zum seltsamen Verhalten: Du schreibst nicht, was passiert genau, wenn man Button 3 anklickt. Welche Farbe hast du denn dann? Weiß? Und was passiert, wenn du Button 3 als erstes anklickst? Zum Positionieren von Komponenten: klar kann man das - was ist denn genau dein Problem? |
AW: Radieren/Freilegen von Bildern mit FMX
Hallo striderx,
ich habe es extra so ausführlich aufgeführt. Das Löschen der Bitmap kann in diesem Fall ignoriert werden. Ansonsten hast du Recht, dass es einmal reicht. Wie gesagt, in diesem Fall uninteressant. Die Bitmap-Größe muss angegeben werden, da sonst kein Bitmap angezeigt wird. Das Ganze wird im Normalfall im onCreate einmalig gesetzt. Zu Anschauungszwecken und zum Verständnis hier in verschieden Routinen verteilt. Die Farbe ist die Standardfarbe des Image. Auch wenn der Button3 zuerst betätigt wird tut sich nichts. So wie es aussieht hat Delphi noch immer Macken. Der Fehler liegt in dieser Zeile:
Delphi-Quellcode:
Im Normalfall werden hier keine Parameter angegeben. Auch bei Nutzung von Strg+Leertaste wird nur Create ohne Parameter angeboten.
Image1.Bitmap := TBitmap.Create;
Tatsächlich gibt es noch constructor Create, der Parameter erwartet. Dieses Create funktioniert aber nur bei richtiger Nutzung. Erwartet wird hier ein Integer! Übergibt man allerdings Image.width(in Delphi 10 ist width ein Single), so funktioniert das Ganze nicht. Der Compiler zeigt allerdings keinen Fehler an. Fazit: Nur der Aufruf von Create führt dazu, dass das Bitmap nicht angezeigt wird. Der Aufruf von Create mit Parametern vom falschen Typ führt ebenfalls zum Fehler wie vorher beschrieben, wird aber vom Compiler ignoriert. Lediglich der Aufruf von Create mit Parametern vom richtigen/erwarteten Typ bringt das gewünschte Ergebnis. Um eine Komponente zu Positionieren gibt man die Position von Links und von Oben an. Label1.Left gibt es aber nicht. Gruß |
AW: Radieren/Freilegen von Bildern mit FMX
Zitat:
Zitat:
Zitat:
Hast Du eigentlich mal nachgesehen, ob für Button 3 das OnClick-Ereignis noch 'verdrahtet' ist? Zitat:
|
AW: Radieren/Freilegen von Bildern mit FMX
Hätte ich den deiner Meinung nach überflüssigen Kram nicht angegeben, würde darauf hingewiesen, dass etwas fehlt.
Weiterhin kann eine Fehlersuche nur stattfinden, wenn aller Kram angegeben ist, da sonst potenzielle Fehlerquellen möglicherweise ausgeschlossen werden bzw. nicht beachtet werden. Zum Testen habe ich den Kram genau so benutzt. Ja, das onClick-Ereignis für Button3 ist verdrahtet. Danke für die Info auf die Eigenschaft Position. Gruß |
AW: Radieren/Freilegen von Bildern mit FMX
Zitat:
![]() |
AW: Radieren/Freilegen von Bildern mit FMX
Liste der Anhänge anzeigen (Anzahl: 1)
Batürlich geht das in FMX!
Anbei ein schnell zusammen-geklöppeltes Programm, das meinen geschilderten Ansatz zeigt. Wenn du jetzt noch in die zweite Bitmap zum Anfang ein Bild lädst, dann müsste das doch im Grunde das sein, was du eingangs beschrieben hast. |
AW: Radieren/Freilegen von Bildern mit FMX
Hallo zusammen,
natürlich funktioniert das unter FMX, so wie es striderx beschrieben hat. Es ist keine weitere Komponente nötig. Dein Anwendungsbeispiel läuft bei mir nicht. Gibt einen Fehler beim Kompilieren. Nicht weiter tragisch, da das Ganze bereits läuft, danke deiner Hinweise im Thread. Gruß |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz