![]() |
PNG und Bitmap laden
Hi,
die Unit PNGImage welche ich lange Zeit benutzt habe lädt offensichtlich nicht alle PNGs, wie ich heute festgestellt habe. Gibt es eine Unit die wirklich ordentlich PNGs in allen Versionen des Formats laden kann ? Ob nun Transparenz geladen wird oder nicht ist mir egal, denn das brauche ich nicht. |
Re: PNG laden
Kommt vielleicht die GraphicEx-Library mit Deinen PNGs klar?
![]() |
Re: PNG laden
Schwierig zu sagen, ob es an der Bibliothek liegt oder an folgendem Code:
Delphi-Quellcode:
Ich muss (leider) die ganzen Fremdformate konvertieren, da eine TImageList nur TBitmap oder TIcon unterstützt. Wäre eventuell eine bessere Lösung, die ImageList zu modifizieren, aber das klappt denke ich nicht, da ein Canvas grundsätzlich ein TBitmap benötigt. ABER man könnte trotzdem direkt ein Canvas.Draw(0, 0, PNG); einbauen, ob das sich positiv in der Performance ausdrückt und sich dementsprechend der Aufwand lohnt...gute Frage. Aber nun zum Code: Bitmap ungültig lautet die Fehlermeldung in der Zeile Bmp.Assign(Png).
procedure Png2Bmp(var Bmp : TBitmap; PngFilename : String);
var Png : TGraphicExGraphic; begin Bmp := TBitmap.Create; Png := TGraphicExGraphic.Create; try Png.LoadFromFile(PngFilename); Bmp.Assign(Png); finally Png.Free; end; end; |
Re: PNG laden
Lass mal die Zeile
Zitat:
|
Re: PNG laden
Nein, das Bitmap ist zu dem Zeitpunkt nicht erzeugt und muss von dieser Funktion erzeugt werden. Habe es dennoch probiert und hat wie erwartet auch nichts geändert.
|
Re: PNG laden
Ich versteh die Logik zwar nicht ganz, aber wenn es nur um eine ImageList für PNGs geht, kannst Du auch einmal bei
![]() |
Re: PNG laden
Nicht nur für PNGs. Es sollten möglichst viele Formate unterstützt werden. JPG und BMP müssen zum Beispiel auch noch unterstützt werden. Es kommt mir eben auf Performance an, daher gefällt mir die Funktion Png2Bmp auch nicht.
Die PNGImageList kann für die TListView verwendet werden. Daher denke ich mir gerade, ob es nicht relativ schnell gehen müsste, sich eine eigene ImageList zu programmieren. Sie muss eigentlich nur Laden können. Sozusagen als Icon-/Bild-Array für die ListView, welche dann die Icons/Bilder zeichnet. |
Re: PNG laden
Ich kenne die Bibliothek nicht, aber wie ist denn TGraphicExGraphic definiert? Können das verschiedene Formate sein? Wenn ja, würde ich versuchen, sowohl die PNG, JPG etc. als auch die Bitmap als TGraphicExGraphic zu übergeben und dann zu assignen.
|
Re: PNG laden
So wie ich das sehe ist sie die oberste Klasse und hat als Unterklassen Klassen für PNG, JPG usw. Aber das mit dem assignen habe ich doch oben speziell für PNG schon gemacht und es lief schief.
|
Re: PNG laden
GraphicEx ist sehr cool, man bindet es nur mittels Uses-Anweisung in das Projekt ein und im Hintergrund wird TPicture derart erweitert, dass es alle von der Bibliothek unterstützten Formate laden kann. Ein simples .LoadFromFile() reicht dann aus.
|
Re: PNG laden
Hm, irgendwann dreh ich hier noch durch. Bin deiner Aussage gefolgt und schließlich kam die Meldung, ein Header einer PNG-Datei wäre ungültig. Also einfach den Dateinamen besorgt und mit der einfachen Bildvorschau von XP geöffnet: Es wird geöffnet. Das TImage von Lazarus ist vorbildlich und kann im Gegensatz zu dem von Delphi7 die ganzen Formate. Bei genau dieser Datei gibt auch dieses eine Fehlermeldung zurück. Die Frage ist nur, wie es dann die Bildvorschau schaffen kann.
|
Re: PNG laden
Zitat:
Kannst Du mal eines der PNGs hier als Attachment anheften? |
Re: PNG laden
Liste der Anhänge anzeigen (Anzahl: 1)
Da das Bild ehrlich gesagt zu pervers war, habe ich es schnell mal wegradiert. :stupid: Der Header hat sich dadurch zum Glück nicht verändert, es gibt also weiterhin einen Fehler beim Laden.
Zitat:
|
Re: PNG laden
Die PngComponents haben eine PNGImageList dabei
|
Re: PNG laden
Ich weiß, aber PNG alleine bringt mir nichts. In einer ImageList können mehrere verschiedene Formate sein.
|
Re: PNG laden
X2GraphicContainer und X2GraphicList unterstützen mehrere Formate. Die TBXImageList aus TBX beta ebenfalls. Musst mal googlen, hab grad keinen Link zur Hand.
|
Re: PNG laden
Die X2 Komponenten findet man nicht, TBX wäre die letzte Notlösung für mich. Ist eben auch die Frage, was eine ImageList mit PNG-Unterstützung bringt, wenn sie eben einen oder mehrere Header nicht kann. Mal ganz zu schweigen davon, dass sogar das TBitmap [klartext]scheiße[/klartext] ist, denn nicht mal das kann alle Bitmaps fehlerfrei laden. Wäre alles gar nicht so schlimm, wenn diese Idioten eine bessere Fehlerbehandlung hätten. Statt einer Exception wäre ein Ereignis gut, was der Benutzer mit dem Ereignis anstellt ist sein Problem. Denn so bekomme ich eine Exception. In keinem Fall darf eine Exception irgendeiner Art auftreten. Wenn man einen Ordner mit vielen Bildern auflistet und bekommt immer eine Exception ist das wirklich miserabel.
|
Re: PNG laden
Zitat:
|
Re: PNG laden
Hier gabs mal irgendeinen Thread, in dem auch ich ein paar Funktionien vorgeschlagen habe, um alles mögliche in alles mögliche zu konvertieren, solange es irgendwo als Pixeldaten vorliegt. Ich such' mal und meld mich wenn ichs find :stupid:
|
Re: PNG laden
Zitat:
Also weder Acdsee noch Adobe Photoshop CS3 können diese Datei lesen |
Re: PNG laden
Zitat:
PS: Irfanview schlägt im übrigen sofort vor die Datei in jpeg umzubennen... |
Re: PNG laden
Das ist vielleicht eine Erlösung. Dann muss ich einen Abfang für die Exceptions einbauen, da der Fehler in dem Fall vor einiger Zeit beim Speichern stattfand. Hätte den Abfang früher oder später eh eingebaut, bloß die Frage, warum ich das nicht gleich gemacht habe :roll:
Lukas: Wäre super wenn du das noch finden könntest. :) Könnte man das nicht eigentlich alles in einen Thread auslagern ? Dann würden nach und nach die Thumbnails erscheinen und das Programm wäre benutzbar während der Ladezeit. |
Re: PNG laden
Klar kannst du das auslagern. Du musst die Daten dann nur wieder zurücksynchen mit einem Synchronize-Call. Sollte aber kein großes Problem darstellen.
|
Re: PNG laden
Das ist gut. Habt ihr eigentlich noch eine Idee, wie man das mit den Bitmaps lösen könnte ? Habe dank einem except einfach das Standardicon von .bmp geladen, aber das ist natürlich nicht so schön, wenn dann zwei von zwanzig Bitmaps nicht geladen werden können. Eigentlich ist Bitmap das einfachste Format überhaupt. Müsste es nicht möglich sein, das direkt ohne TBitmap zu laden ? Denn TBitmap basiert soweit ich weiß auf der API und ist daher etwas zurück.
Habe die Überschrift leicht geändert, es geht schon von Anfang an nicht mehr ausschließlich um PNG, daher ziehe ich es vor, den Titel zu ändern damit ein Suchender in der Überschrift auch sieht, dass es zusätzlich noch um Bitmap geht bzw. um eine Möglichkeit die meisten Formate zu laden. |
Re: PNG laden
Zitat:
|
Re: PNG und Bitmap laden
Ich vergesse immer wieder, dass ich die Codes habe :oops:
Zitat:
Zitat:
Edit: Geht nicht, es gibt zwei Klassen die ich ebenfalls übertragen müsste und diese würden wieder andere Klassen verlangen usw. Hatte es mir schon gedacht. |
Re: PNG und Bitmap laden
Komisch... die Windows API müsste eigentlich alle standardgemäßen Windows-Bitmaps laden können.
Wenn TBitmap das nur kapselt, dürfte es eigentlich keine Probleme geben. |
Re: PNG und Bitmap laden
Also ich weiß, dass TBitmap seine Probleme mit 32bit-Bitmaps hat, wenn diese einen Alpha-Kanal besitzen. Das geht ja neuerdings (?) ebenfalls. Ich weiß allerdings nicht, ob diese Bitmaps dann noch zu den "standardgemäßen Windows-Bitmaps" gehören.
|
Re: PNG und Bitmap laden
Ich glaube meine problematischen Bitmaps sind 32er. Habe ich sinnloserweise mal als solche gespeichert. Ich bilde mir gerade ein, ich hätte irgendwo mal die Möglichkeit genutzt, die Farbtiefe auf 32Bit zu setzen, finde aber bei TBitmap nichts.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz