lib spng ( s imple png ) est une bibliothèque C permettant de lire et d'écrire des fichiers au format Portable Network Graphics (PNG) en mettant l'accent sur la sécurité et la facilité d'utilisation.
libspng est une alternative à libpng, les projets sont séparés et les API ne sont pas compatibles.
L'objectif est de fournir une bibliothèque PNG rapide avec une API plus simple que libpng, elle surpasse l'implémentation de référence dans les cas d'utilisation courants.
Fonctionnalité | spng | libpng | image_stb | lodepng |
---|---|---|---|---|
Décoder à partir du flux | ✅ | ✅ | ✅ | |
Correction gamma | ✅ | ✅ | ||
Aucun bug de sécurité connu [1] | ✅ | ✅ | ✅ | |
Lecture d'image progressive | ✅ | ✅ | ||
Analyse tous les morceaux standard | ✅ | ✅ | ||
Ne nécessite pas zlib [2] | ✅ | ✅ | ✅ | |
Codage | ✅ | ✅ | ✅ | ✅ |
PNG animé | Prévu | ✅ [3] |
[1] Le projet est fuzz testé sur OSS-Fuzz et les vulnérabilités sont corrigées avant qu'elles ne soient rendues publiques.
[2] La construction avec miniz est prise en charge.
[3] Avec un patch tiers
Téléchargez la dernière version et incluez spng.c/spng.h
dans votre projet, vous pouvez également construire avec CMake ou Meson, reportez-vous à la documentation pour plus de détails.
#include <spng.h>/* Créer un contexte de décodeur */spng_ctx *ctx = spng_ctx_new(0);/* Définir un tampon d'entrée */spng_set_png_buffer(ctx, buf, buf_size);/* Déterminer la taille de l'image de sortie */spng_decoded_image_size (ctx, SPNG_FMT_RGBA8, &out_size);/* Décoder en RGBA 8 bits */spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0);/* Mémoire de contexte libre */spng_ctx_free(ctx);/* La création d'un contexte d'encodeur nécessite un indicateur */spng_ctx *enc = spng_ctx_new(SPNG_CTX_ENCODER);/* Encode vers le tampon interne géré par la bibliothèque */spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1);/* Spécifier les dimensions de l'image, format PNG */struct spng_ihdr ihdr ={ .width = largeur, .hauteur = hauteur, .bit_profondeur = 8, .color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA};/* L'image sera encodée selon ihdr.color_type, .bit_degree */spng_set_ihdr(enc, &ihdr);/* SPNG_FMT_PNG est une valeur spéciale qui correspond au format dans ihdr, SPNG_ENCODE_FINALIZE finalisera le PNG avec le marqueur de fin de fichier */spng_encode_image(enc, image, image_size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);/* PNG est écrit dans un tampon interne par défaut */void *png = spng_get_png_buffer(enc, &png_size, &error);/* L'utilisateur est propriétaire du tampon après une réussite appeler */free(png);/* Mémoire contextuelle libre */spng_ctx_free(enc);
Voir exemple.c.
Le code est sous licence « simplifiée » BSD 2 clauses.
Le projet contient des optimisations et des images de test de libpng, celles-ci sont sous licence PNG Reference Library License version 2.
Le code est rédigé conformément aux règles de la norme de codage CERT C. Toute arithmétique entière est vérifiée pour tout débordement et toutes les conditions d'erreur sont traitées avec élégance.
La bibliothèque est continuellement fuzzée par OSS-Fuzz, le code est également analysé avec Clang Static Analyser, Coverity Scan et PVS-Studio.
La suite de tests se compose de plus de 1 000 cas de test, 175 images de test sont décodées avec toutes les combinaisons possibles de formats de sortie et d'indicateurs et comparées à libpng pour en vérifier l'exactitude.
Les versions suivent le schéma de version sémantique avec des garanties supplémentaires :
Les versions 0.4.0 à 0.8.x sont stables
Si la version 1.0.0 introduit des changements radicaux, alors la version 0.8.x sera maintenue en tant que branche stable distincte.
Actuellement, la version 1.0.0 devrait être compatible.
La documentation en ligne est disponible sur libspng.org/docs.
Le décodage vers les formats de sortie SPNG_FMT_G8
, SPNG_FMT_GA8
et SPNG_FMT_GA16
n'est pas pris en charge pour toutes les combinaisons de types de couleurs et de profondeurs de bits PNG, voir la documentation pour plus de détails.
La correction gamma n'est pas implémentée pour les formats de sortie SPNG_FMT_PNG
, SPNG_FMT_G8
, SPNG_FMT_GA8
et SPNG_FMT_GA16
.
Vous pouvez parrainer le développement via OpenCollective, les fonds seront utilisés pour la maintenance et le développement ultérieur conformément à la feuille de route.
Soutenez ce projet avec votre organisation. Votre logo apparaîtra ici avec un lien vers votre site Web. [Contribuer]