Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi [Erledigt] PNG kann nicht geladen werden wegen CRC Fehler (https://www.delphipraxis.net/210182-%5Berledigt%5D-png-kann-nicht-geladen-werden-wegen-crc-fehler.html)

berens 14. Mär 2022 21:17

[Erledigt] PNG kann nicht geladen werden wegen CRC Fehler
 
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

TurboMagic 15. Mär 2022 17:11

AW: [Erledigt] PNG kann nicht geladen werden wegen CRC Fehler
 
Hallo,

du könntest in QP https://quality.embarcadero.com
einen feature Request einstellen und dir damit eine "IgnoreCRCErrors" property für TPNGImage
wünschen. Nutzung natürlich auf eigene Gefahr und Default natürlich aus.
Du solltest es dann aber damit begründen, dass du schon fehlerhafte PNGs ohne/mit falscher
Prüfsumme erhalten hast, die sich sonst gar nicht laden lassen.

Grüße
TurboMagic

Uwe Raabe 15. Mär 2022 17:16

AW: [Erledigt] PNG kann nicht geladen werden wegen CRC Fehler
 
Das ist in der Tat nicht ganz glücklich gelöst. Als die Units noch Open Source waren, konnte man die Defines ja problemlos für sich setzen.

Das geht nun nicht mehr, da die VCL ja in kompilierter Form mitgeliefert wird. Jetzt wäre wohl eher globale Variablen angesagt.

Ich plädiere da auch für einen entsprechenden Feature-Request.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:24 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