Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi PngImageList.Draw() auf TImage.Canvas verliert AlphaKanal (https://www.delphipraxis.net/158682-pngimagelist-draw-auf-timage-canvas-verliert-alphakanal.html)

s.h.a.r.k 26. Feb 2011 17:47

PngImageList.Draw() auf TImage.Canvas verliert AlphaKanal
 
Guten Abend zusammen,

vorab will ich erst mal meine Idee beschreiben: ich habe im Moment eine Ableitung von TPngImageList, welche einen Timer integriert hat und bei jedem Timer-Event das nächte Bild auf ein TargetImage zeichnet. So kann ich z.B. einen Throbber darstellen und auch beliebig andere Dinge animieren -- ganz nach dem "Vorbild" der GIF-Animation. Der Nutzer sollte eigentlich klar sein: man erzeugt lediglich die gewünschten Bilder, lädt diese in die ImageList und lässt es eben ablaufen.

Nun will ich diese Idee allerdings etwas abstrahieren und eine Art "Linker" basteln, der als Verknüpfung zwischen einer TCustomImageList und einem TImage agiert, d.h. es liegen schon ein TImage und eine TImageList auf der Form und ich liefere eine weitere Komponente, mit der die Bidler aus der Liste auf die TImage-Instanz projeziert werden. Ich will meinen Code somit von der TPngImageList lösen und verallgemeinern. Somit will ich auch weniger Abhängigkeiten schaffen.

So schön dieser Grundgedanke auch sein mag, ich habe beim Zeichnen (
Delphi-Quellcode:
FImageList.Draw(...)
) das Problem, dass wenn es sich um eine TPngImageList handelt, der AlphaKanal verloren geht -- es erscheint ein weißer Hintergrund. Die referenzierte ImageList ist ja eine TPngImageList, weswegen die Images darin einen AlphaKanal besitzen. Warum und wo geht denn dieser aber beim Aufruf der Draw-Methode verloren? Eine spezielle Behandlung dieser Klasse will ich unbedingt vermeiden, da das ja nicht Sinn und Zweck ist. Ist evtl. die TPngImageList schuld, da diese die Draw-Methode nicht überschreibt?

Lustigerweise ist es so, dass wenn ich auf auf eine TPaintBox male, der Hintergrund nicht weiß, sondern transparent ist. Ich habe daber bei meiner TImage-Instanz schon ziemlich viel bzgl. den Eigenschaften PixelFormat, AlphaFormat, ColorDepth und was weiß ich noch probiert -> ohne Erfolg. Vielleicht kann hier ja jemand Licht ins Dunkel bringen.

Bummi 26. Feb 2011 21:47

AW: PngImageList.Draw() auf TImage.Canvas verliert AlphaKanal
 
Das liegt daran dass ein Image selbst nicht transparent ist, wenn Du nur ein Pixel setzt wird das ganze Image weiß initialisiert.
Das PNG wird sicher transparent gemalt (mal es mal doppelt um 10 Pixel versetzt, oder füll das Image vorher mit einem Bitmap).
Ich verwende für solche Sachen meist eigene von TGrapicControl abgeleitete Komponenten.

Uwe Raabe 27. Feb 2011 10:34

AW: PngImageList.Draw() auf TImage.Canvas verliert AlphaKanal
 
Das Problem liegt wohl daran, daß du auf einem TImage.Canvas zeichnest. Das TImage ist so ausgelegt, daß es seinen Inhalt aus dem Picture-Property zeichnet. Wenn ich in einem kleinen Testprogramm anstatt auf dem TImage.Canvas auf dem TForm.Canvas zeichne, kommt der Alpha-Kanal sehr wohl korrekt rüber. Das Problem ist hier also wohl eher das TImage.

s.h.a.r.k 28. Feb 2011 12:04

AW: PngImageList.Draw() auf TImage.Canvas verliert AlphaKanal
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1084629)
Das Problem liegt wohl daran, daß du auf einem TImage.Canvas zeichnest. Das TImage ist so ausgelegt, daß es seinen Inhalt aus dem Picture-Property zeichnet. Wenn ich in einem kleinen Testprogramm anstatt auf dem TImage.Canvas auf dem TForm.Canvas zeichne, kommt der Alpha-Kanal sehr wohl korrekt rüber. Das Problem ist hier also wohl eher das TImage.

Das mit dem Form1.Canvas habe ich auch schon herausgefunden gehabt, was mir bzgl. diesem Problem aber nicht wirklich eine Lösung beschert hat. Nun ja, dann muss ich mal schauen, wie genau TImage funktioniert. Bei meinen bisherigen Suchen hatte ich nur noch keinerlei Lösung gefunden. Jedenfalls danke für die Infos, Jungs ;)


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