Débuter avec le png

libpng version 1.6.21

Libpng a été écrit comme un compagnon de la spécification PNG afin de réduire le temps et les efforts nécessaires pour prendre en charge le format de fichier PNG dans les programmes d’application.

Libpng a été conçu pour gérer plusieurs sessions à la fois, pour être facilement modifiable, pour être portable sur la grande majorité des machines (ANSI, K&R, 16, 32 et 64 bits) disponibles et pour être facile à utiliser. Le but ultime est de promouvoir l’acceptation du format PNG de toutes les manières possibles. Bien qu’il reste encore du travail à faire (voir le fichier TODO), libpng devrait couvrir la majorité des besoins des utilisateurs.

Limites d’utilisateur :

La spécification PNG permet à la largeur et à la hauteur d’une image d’être aussi grandes que 2^31-1 (0x7fffffff), soit environ 2,147 milliards de lignes et de colonnes. Pour des raisons de sécurité, libpng impose une limite par défaut de 1 million de lignes et de colonnes. Les images plus grandes seront rejetées immédiatement avec un appel png_error(). Libpng peut rejeter des images très larges en raison de conditions potentielles de débordement de tampon, mais vous pouvez définir vos propres limites avec :

png_set_user_limits(png_ptr, width_max, height_max);

Mettez cette instruction après avoir créé la structure PNG et avant d’appeler png_read_info(), png_read_png() ou png_process_data().

Lors de l’écriture d’un flux de données PNG, placez cette instruction avant d’appeler png_write_info() ou png_write_png().

Pour récupérer les limites appliquées, utilisez

width_max = png_get_user_width_max(png_ptr);
height_max = png_get_user_height_max(png_ptr);

La spécification PNG ne fixe aucune limite au nombre de blocs auxiliaires autorisés dans un flux de données PNG. Par défaut, libpng impose une limite d’un total de 1000 morceaux sPLT, tEXt, iTXt, zTXt et inconnus à stocker. SI info_ptr et end_info_ptr sont définis, la limite s’applique séparément à chacun. Modifiez la limite du nombre total de ces blocs à stocker avec :

png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);

0x7ffffffL signifie illimité. Vous pouvez récupérer cette limite avec :

chunk_cache_max = png_get_chunk_cache_max(png_ptr);

Libpng impose une limite de 8 mégaoctets (8 000 000 octets) sur la quantité de mémoire qu’un morceau compressé autre qu’IDAT peut occuper, lorsqu’il est décompressé. Vous pouvez modifier cette limite avec :

png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);

et vous pouvez récupérer la limite avec:

chunk_malloc_max = png_get_chunk_malloc_max(png_ptr);

Tous les blocs qui entraîneraient le dépassement de l’une ou l’autre de ces limites seront ignorés.

Détection de la version de libpng :

La fonction png_get_io_ptr() est présente depuis libpng-0.88, n’a jamais modifié et n’est pas affecté par les macros de compilation conditionnelle. C’est le meilleur choix à utiliser dans les scripts de configuration pour détecter la présence de tout version libpng depuis la 0.88. Dans une autoconf “configure.in”, vous pouvez utiliser

AC_CHECK_LIB(png, png_get_io_ptr, ...