Einzelnen Beitrag anzeigen

Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#1

PngImageList.Draw() auf TImage.Canvas verliert AlphaKanal

  Alt 26. Feb 2011, 18:47
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 (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.
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat