Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi PNG und Bitmap laden (https://www.delphipraxis.net/116820-png-und-bitmap-laden.html)

Nils_13 7. Jul 2008 09:40


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.

Daniel 7. Jul 2008 09:43

Re: PNG laden
 
Kommt vielleicht die GraphicEx-Library mit Deinen PNGs klar?
http://www.soft-gems.net/index.php?o...d=13&Itemid=33

Nils_13 7. Jul 2008 09:53

Re: PNG laden
 
Schwierig zu sagen, ob es an der Bibliothek liegt oder an folgendem Code:
Delphi-Quellcode:
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;
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).

DeddyH 7. Jul 2008 09:56

Re: PNG laden
 
Lass mal die Zeile
Zitat:

Delphi-Quellcode:
Bmp := TBitmap.Create;

weg. Du übergibst die Bitmap doch bereits als Referenz.

Nils_13 7. Jul 2008 09:58

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.

DeddyH 7. Jul 2008 10:01

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 Thany.org nachsehen, da gibt es eine.

Nils_13 7. Jul 2008 10:10

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.

DeddyH 7. Jul 2008 10:21

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.

Nils_13 7. Jul 2008 10:23

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.

Daniel 7. Jul 2008 10:24

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.

Nils_13 7. Jul 2008 10:32

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.

Daniel 7. Jul 2008 10:35

Re: PNG laden
 
Zitat:

Zitat von Nils_13
Hm, irgendwann dreh ich hier noch durch.

Zu keinem anderen Zweck habe ich die DP eröffnet. :stupid:

Kannst Du mal eines der PNGs hier als Attachment anheften?

Nils_13 7. Jul 2008 10:40

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:

Zitat von Daniel
Zu keinem anderen Zweck habe ich die DP eröffnet.

Dann bist du der Architekt (Matrix Reloaded). :mrgreen:

franktron 7. Jul 2008 10:40

Re: PNG laden
 
Die PngComponents haben eine PNGImageList dabei

Nils_13 7. Jul 2008 10:41

Re: PNG laden
 
Ich weiß, aber PNG alleine bringt mir nichts. In einer ImageList können mehrere verschiedene Formate sein.

Andreas L. 7. Jul 2008 10:52

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.

Nils_13 7. Jul 2008 11:25

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.

memphis 7. Jul 2008 11:42

Re: PNG laden
 
Zitat:

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. 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.
Wenn du die Exception abfängst, kannst du darauf genau so reagieren, wie du willst (z.B. das Default Bild laden, Image überspringen...). Ein Ereignis ist in diesem Fall überhaupt keine gute Idee, denn damit hast du keine Möglichkeit den Programmfluß gezielt nach einem Fehler zu steuern.

DGL-luke 7. Jul 2008 12:00

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:

franktron 7. Jul 2008 12:04

Re: PNG laden
 
Zitat:

Zitat von Nils_13
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:

Zitat von Daniel
Zu keinem anderen Zweck habe ich die DP eröffnet.

Dann bist du der Architekt (Matrix Reloaded). :mrgreen:


Also weder Acdsee noch Adobe Photoshop CS3 können diese Datei lesen

Lossy eX 7. Jul 2008 12:18

Re: PNG laden
 
Zitat:

Zitat von Nils_13
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.

Vielleicht liegt es auch nur daran, dass dein PNG in Wirklichkeit ein JPEG ist? Das du dann einen Fehler bekommst ist vollkommen logisch ist, denn das TPicture extrahiert intern die Dateiendung und vergleicht sie mit der Liste der registrierten Endungen. Und das hat zur Folge, dass die falsche Klasse erstellt wird. Die kann dann logischerweise nichts mit dem Inhalt anfangen und schmeißt vollkommen zu recht einen Fehler.

PS: Irfanview schlägt im übrigen sofort vor die Datei in jpeg umzubennen...

Nils_13 7. Jul 2008 12:44

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.

DGL-luke 7. Jul 2008 12:46

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.

Nils_13 7. Jul 2008 13:05

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.

Daniel 7. Jul 2008 13:07

Re: PNG laden
 
Zitat:

Zitat von Nils_13
Denn TBitmap basiert soweit ich weiß auf der API und ist daher etwas zurück.

eh. Nein, nicht so sehr. Wenn Du ein Delphi >= Pro hast, schaue Dir die Quellen an. Im Allgemeinen ist es natürlich möglich, ein Bitmap selbst zu laden (Definition siehe wotsit.org) - aber ich würde das nicht machen.

Nils_13 7. Jul 2008 13:17

Re: PNG und Bitmap laden
 
Ich vergesse immer wieder, dass ich die Codes habe :oops:
Zitat:

Zitat von Delphi
{ TBitmap is an encapsulation of a Windows HBITMAP and HPALETTE. [...] }

Zitat:

Zitat von Lazarus
{ TSharedImage - base class for reference counted images }
{ TBitmapImage - Descendent of TSharedImage for TBitmap. If a TBitmap is assigned to another TBitmap, only the reference count will be increased and both will share the same TBitmapImage }

Ich könnte probieren das TBitmap von Lazarus rüberzuschieben, glaube zwar nicht dass es funktioniert, aber einen Versuch ist es wert. Lazarus funktioniert in dem Fall, aber dafür Delphi nicht, einer von beiden macht immer Probleme undzwar immer der auf den man angewiesen ist :mrgreen:

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.

DGL-luke 7. Jul 2008 14:15

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.

Daniel 7. Jul 2008 14:17

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.

Nils_13 7. Jul 2008 14:26

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:35 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