Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#1

[Erledigt] PNG kann nicht geladen werden wegen CRC Fehler

  Alt 14. Mär 2022, 21:17
Zitat:
Dieses "Portable Network Graphics" Bild ist ungültig, weil Teile der Daten fehlerhaft sind (CRC-Fehler)
Bzw:
Zitat:
EPngInvalidCRCText = 'This "Portable Network Graphics" image is not valid because it contains invalid pieces of data (crc error)
Hallo!
Da ich im Internet keine Lösung für diese Problem gefunden habe, hier kurz meine Erkenntnisse für die Nachwelt:

Problem:
Beim Laden einer PNG-Datei über z.B. Image1.Picture.LoadFromFile kann es zu einer Exception kommen, und das Bild wurde nicht geladen. Leider klappen auch die Alternativen über GR32 etc. nicht, die Grafik kann aber in Windows und den meisten (nicht Allen!) anderen Programmen korrekt angezeigt werden.

Ursache: Die CRC-Prüfsumme der PNG-Datei ist falsch oder fehlt. Dies kann man sehen, wenn man die Datei z.B. in einem Hex-Editor oder Notepad++ aufmacht, und sich dort das 2-4 Byte nach dem Dateibeginn "%PNG" anschaut. In meinem Beispiel war der Wert NUL bzw. 0x00.

Da die Bilder -in meinem Fall- vom Kunden geliefert werden, und ich keinen Einfluss auf die Erstellung der Prüfsumme habe, sollen sie halt trotzdem geladen werden, falls irgendwie möglich.

Lösung:
Man muss den Quellcode der Vcl.Imaging.pngimage.pas bzw pngimage.pas bearbeiten. Füge die Unit deinem Projekt hinzu (Ich finde sie bei mir unter C:\Program Files (x86)\Embarcadero\Studio\21.0\source\vcl ), und ändere die Zeilen

Delphi-Quellcode:
{$DEFINE ErrorOnUnknownCritical} //Error when finds an unknown critical chunk
{$DEFINE CheckCRC}               //Enables CRC checking
so ab, dass das $Define nicht mehr gilt (Punkt vor das $-Zeichen):

Delphi-Quellcode:
{.$DEFINE ErrorOnUnknownCritical} //Error when finds an unknown critical chunk
{.$DEFINE CheckCRC}               //Enables CRC checking
Projekt neu kompilieren und austesten - bei mir geht's nun.

Man muss sich natürlich der möglichen Nebeneffekte wie z.B. der "falschen" Darstellung einer wirklich defekten Datei bewusst sein, aber da andere Programm sie in dem Fall auch nicht richtig Dargestellt werden würden, kann man das dem Kunden auch klar kommunizieren im vgl. zu "Ja, andere Programme können schon die PNG-Datei laden - nur halt meines nicht...".

Nachdem man die pngimage einmalig kompiliert hat, kann man sie eigentlich auch wieder aus dem Projekt entfernen - die Änderungen sollten afaik dauerhaft erhalten bleiben bis Delphi oder der PC neu installiert werden - da muss man sich halt einen Reminder machen, auf dem neuen PC die Änderungen auch vorzunehmen. Ich glaube, ich lasse vorsichtshalber die pngimage in Zukunft von meinem Hauptprojekt mitkompilieren - man weiß ja nicht.

Für konstruktive Anmerkungen zu dem Thema bin ich dankbar,
ich hoffe ich konnte Euch und meinem "Zukunfts-Ich" mit dieser Info weiterhelfen!

lg
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit
  Mit Zitat antworten Zitat