Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Radieren/Freilegen von Bildern mit FMX (https://www.delphipraxis.net/201453-radieren-freilegen-von-bildern-mit-fmx.html)

paul.kunig 23. Jul 2019 16:18

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ß

mkinzler 23. Jul 2019 16:29

AW: Radieren/Freilegen von Bildern mit FMX
 
https://github.com/zhaoyipeng/graphics32-for-Firemonkey

paul.kunig 23. Jul 2019 17:29

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ß

Neutral General 23. Jul 2019 17:44

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.

paul.kunig 23. Jul 2019 17:53

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.

striderx 23. Jul 2019 19:11

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.

paul.kunig 23. Jul 2019 19:28

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"?
Hier im Forum suchenCopyRect wird von FMX nicht unterstützt?
Hier im Forum suchenDoubleBuffered gibt es in Delphi 10 Seattle nicht mehr.

Wie du schon selber sagst, gilt das für die VCL.
Allerdings benötige ich das Ganze in oder mit FMX.

striderx 23. Jul 2019 19:51

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.


>>Hier im Forum suchenCopyRect wird von FMX nicht unterstützt?<<

Könnte sein, dass das unter FMX CopyFromBitmap ist.


>>Hier im Forum suchenDoubleBuffered gibt es in Delphi 10 Seattle nicht mehr.<<

Das ist in der VCL auch keine Eigenschaft von tImage. Aber wahrscheinlich brauchst du das eh nicht, weil FMX m. W. Hardware-Beschlenigung nutzt.

paul.kunig 23. Jul 2019 21:08

AW: Radieren/Freilegen von Bildern mit FMX
 
Zitat:

Deswegen solltest du die schwarze Fläche erst ändern und dann einen Refresh auslösen.
Was macht das für einen Unterschied. Beim erneuten Refresh wird wieder alles neugezeichnet. Also Zeichenfläche wieder schwarz(Ich arbeite nicht mit MausKlick, sondern mit einem Timer).

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?

striderx 23. Jul 2019 21:47

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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:41 Uhr.
Seite 1 von 3  1 23      

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