PNG in TImage
-
Habe mir über torry net "Portable Network Graphics Delphi 1.564" geladen.
Was es scheinbar nicht mehr auf http://pngdelphi.sourceforge.net gibt.Ich kann zur Designzeit in ein TImage über Picture ein PNG laden und anzeigen.
Wenn ich das Programm compiliere und ausführe, ist die Grafik wie "invertiert" dargestellt, jedenfalls völlig falsch. Ich kann auch seltsamerweise nicht Image1->Picture->LoadFromFile("bild.png"); machen, da er dann "unbekanntes format png" beim ausführen meckert.Kann jemand sagen warum die Grafik zur Laufzeit so falsch angezeigt wird und warum ich es nicht zur Laufzeit laden kann, obwohl ich es zur Designzeit über die Komponente laden und anzeigen lassen kann?
-
Ich habs jetzt so hinbekommen, das er die Grafik korrekt zur Laufzeit darstellt:
TPNGObject *png = new TPNGObject(); png->LoadFromFile("bild.png"); Image1->Picture->Assign(png); delete png;
Die Fragen oben bleiben natürlich trotzdem. Ist ja schon komisch.
-
Hallo,
BCB-Hilfe schrieb:
Die Methode Assign weist dem TPicture-Objekt eine Grafik zu.
virtual void __fastcall Assign(Classes::TPersistent* Source);
Beschreibung
Enthält der Parameter Source einen für die Eigenschaft Graphic gültigen Objekttyp, wird diese Grafik Graphic zugewiesen.
Die von Assign durchgeführten Aktionen sind vom aktuellen Typ der TPicture-Eigenschaft Graphic und des Parameters Source abhängig. Enthalten beispielsweise Graphic und Source eine Bitmap-Grafik (TBitmap), wird diese aus dem Parameter Source in die Eigenschaft Graphic kopiert. Es können auch ähnliche Grafiktypen wie TIcon oder TMetafile angegeben werden.Enthält Source kein für die Eigenschaft Graphic gültiges Objekt, ruft Assign die Methode der übergeordneten Klasse auf, die die Grafik aus einem kompatiblen Objekt kopiert.
ich vermute es hat etwas mit dem von mir fett markierten Hilfetext zu tun. Da das Ganze etwas kryptisch für mich ist, ist das aber wirklich nur eine Vermutung!
MfG
-
Das ist auch nur eine Vermutung, aber kann es sein, dass TPNGObject vorher mit TPicture::RegisterGraphicFormat (oder etwas in der Richtung) registriert werden muss?
-
Hi,
versuch doch mal:TPNGObject *png = new TPNGObject(); png->LoadFromFile("bild.png"); Image1->Bitmap->Assign(png); delete png;
Ich denke nämlich das es an der Bittiefe des PNGs liegt das Picture in diesem Fall evtl. nicht untersützt, da PNG ja noch den Alphachannel hat, den glaub ich Picture nicht hat. Bitmap unterstützt ja 32Bit, da könnte es gehen.
mfg
-
@Kolumbus
Ich weiss leider nicht auf was das jetzt eine Antwort sein sollte.@XMaster
Wurde es, ansonsten könnte ich wohl nicht ein PNG zur Designzeit in Image1->Picture einladen.@Raccoon666
Mein Beispiel funktioniert, steht auch so da. Es geht um die Fragen im Startbeitrag. ^^
-
pngus schrieb:
@Raccoon666
Mein Beispiel funktioniert, steht auch so da. Es geht um die Fragen im Startbeitrag. ^^Ups, sry, da hab ich wohl noch gepennt
mfg
-
Hmm... Meine Vermutung war (ist) einfach: Deine *.png-Datei ist nicht kompatibel zu TImage->Picture.
BCB-Hilfe schrieb:
Die Eigenschaft Graphic gibt die im TPicture-Objekt enthaltene Grafik an.
__property TGraphic* Graphic = {read=FGraphic, write=SetGraphic};
Beschreibung
Mit Graphic können Sie angeben, welche Grafik das Objekt enthält. Ein TPicture-Objekt kann Grafiken des Typs Bitmap, Symbol oder Metadatei sowie benutzerdefinierte Grafikklassen enthalten.
Das liest sich irgendwie, als ob du eine Benutzerdefinierte Grafikklasse bräuchtest, wenn du eine *.png-Datei in TImage->Picture laden willst... Hast du aber nicht, oder?
-
Doch klar, hab TPNGObject und ich schrieb ja auch das ich zur Designzeit in das TImage über Eigenschaft Picture eine PNG erfolgreich laden und darstellen kann. Was so normal nicht geht. Zur Runtime sieht man dann zwar die PNG auch, aber irgendwie "invertiert". Naja, steht ja im Startbeitrag. ^^
-
Da du ja immer so fleißig auf deinen Startbeitrag verweist:
pngus schrieb:
[...]Ich kann auch seltsamerweise nicht Image1->Picture->LoadFromFile("bild.png"); machen, da er dann "unbekanntes format png" beim ausführen meckert.[...]
merkste was?
Nur weil etwas zur Designzeit zufällig richtig dargestellt wird, muss das zur Laufzeit nicht automatisch auch der Fall sein...
Verstehste jetzt wie ich das meine?
-
Wird es aber in der Komponente, wie sonst sollte ich es in der Designzeit nutzen können und vor allem wird die PNG auch korrekt dargestellt.
TImage stellt ja nun nicht aus Lust und Laune ihm unbekannte Grafikformate dar.{Registers TPNGObject to use with TPicture} {$IFDEF UseDelphi}{$IFDEF RegisterGraphic} TPicture.RegisterFileFormat('PNG', 'Portable Network Graphics', TPNGObject); {$ENDIF}{$ENDIF}
-
Guten Morgen,
bis auf dein Beharren auf das Funktionieren Laden / Anzeigen des png-Bildes zur Designzeit kommt nicht viel kreatives von dir. Ich kann dir nur aus Erfahrung sagen, dass nicht Alles was zur Designzeit (scheinbar) funktioniert auch zur Laufzeit funktioniert!
Probier' einfach mal eine andere Komponente zum Laden / Anzeigen des Bildes - es gibt bestimmt ein Menge freier Komponenten im Internet. Vielleicht auch eine die speziell für *.png-Dateien gemacht ist!?MfG
-
Klasse Aussage von dir! Kann aber das Kompliment zurückgeben.
Zumindest habe auch einen funktionierenden Weg zur Darstellung zur Laufzeit gefunden und hier angegeben und alles spricht dafür das es funktionieren müsste.
Ich denke doch mal das torry net ziemlich umfangreich ist, aber auch dort gibt es keine PNG Komponente, zumal auch diese lediglich sich in TPicture einbettet.