AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi PngImageList.Draw() auf TImage.Canvas verliert AlphaKanal
Thema durchsuchen
Ansicht
Themen-Optionen

PngImageList.Draw() auf TImage.Canvas verliert AlphaKanal

Ein Thema von s.h.a.r.k · begonnen am 26. Feb 2011 · letzter Beitrag vom 28. Feb 2011
Antwort Antwort
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
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#2

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

  Alt 26. Feb 2011, 22:47
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.452 Beiträge
 
Delphi 12 Athens
 
#3

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

  Alt 27. Feb 2011, 11:34
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von s.h.a.r.k
s.h.a.r.k

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

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

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


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:26 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