Décompresser PNG en utilisant zlib

Comment utiliser la bibliothèque zlib pour décompresser un fichier PNG? J’ai besoin de lire un fichier PNG en utilisant un compilateur C sous gcc.

J’ai déjà codé une bibliothèque Java de base pour lire / écrire des fichiers PNG: http://code.google.com/p/pngj/

Il ne prend pas en charge les images palettisées, mais à part cela [Mise à jour: toutes les variantes de PNG sont sockets en charge ], il est assez complet, simple et le code ne comporte aucune dépendance externe (autrement dit, il utilise uniquement l’API JSE standard, qui inclut la décompression zip). Et le code est disponible. Je suppose que vous pouvez le porter en C sans trop d’effort.

Pourquoi ne pas utiliser libpng ? Le format de fichier PNG est assez simple, mais il existe de nombreuses variantes et méthodes d’encodage possibles et il peut s’avérer fastidieux de s’assurer de couvrir tous les cas. Quelque chose comme libpng gère toutes les conversions et tout pour vous automatiquement.

S’il s’agit d’un devoir et que vous n’êtes vraiment limité qu’à la bibliothèque standard C, consultez la spécification officielle du format de fichier PNG: http://www.w3.org/TR/PNG/ . Cependant, êtes-vous sûr de devoir décoder le fichier PNG? Si tout ce que vous avez à faire est de l’afficher d’une manière ou d’une autre, vous vous dirigez sur la mauvaise voie.

Écrire un décodeur pour n’importe quel fichier PNG général sera assez complexe et fastidieux, mais pas trop mal pour les simples. En fait, étant donné que le format PNG permet de compresser des éléments, le faire avec uniquement des bibliothèques C standard vous obligerait à implémenter gzip decompress (un devoir raisonnable pour un cours de premier cycle de niveau moyen, mais je suppose que vous aurait passé beaucoup de temps à discuter d’algoirthmes de compression avant que cela ne vous soit atsortingbué)

Cependant, ce n’est pas très difficile si vous vous limitez aux fichiers PNG non compressés et non entrelacés. J’ai écrit un décodeur une fois en Python qui ne traitait que les cas simples en quelques heures, alors je suis sûr que ce sera faisable en C.

Vous devriez probablement vous renseigner sur le fonctionnement d’un format de fichier binary et utiliser un éditeur hexadécimal au lieu d’un éditeur de texte pour examiner les fichiers. Généralement, vous devriez utiliser libpng pour gérer les fichiers png comme indiqué précédemment, mais si vous voulez le décoder vous-même, vous avez beaucoup de lecture à faire.

Je recommande de lire ceci http://www.libpng.org/pub/png/book/chapter13.html