lib spng ( simple png ) ist eine C-Bibliothek zum Lesen und Schreiben von Dateien im Portable Network Graphics (PNG)-Format mit Schwerpunkt auf Sicherheit und Benutzerfreundlichkeit.
libspng ist eine Alternative zu libpng, die Projekte sind getrennt und die APIs sind nicht kompatibel.
Das Ziel besteht darin, eine schnelle PNG-Bibliothek mit einer einfacheren API als libpng bereitzustellen, die in gängigen Anwendungsfällen die Referenzimplementierung übertrifft.
Besonderheit | spng | libpng | stb_image | lodepng |
---|---|---|---|---|
Aus Stream dekodieren | ✅ | ✅ | ✅ | |
Gammakorrektur | ✅ | ✅ | ||
Keine bekannten Sicherheitslücken [1] | ✅ | ✅ | ✅ | |
Progressives Bildlesen | ✅ | ✅ | ||
Analysiert alle Standardblöcke | ✅ | ✅ | ||
Erfordert kein Zlib [2] | ✅ | ✅ | ✅ | |
Codierung | ✅ | ✅ | ✅ | ✅ |
Animiertes PNG | Geplant | ✅ [3] |
[1] Das Projekt wird auf OSS-Fuzz getestet und Schwachstellen werden behoben, bevor sie öffentlich werden.
[2] Das Erstellen mit Miniz wird unterstützt.
[3] Mit einem Drittanbieter-Patch
Laden Sie die neueste Version herunter und fügen Sie spng.c/spng.h
in Ihr Projekt ein. Sie können auch mit CMake oder Meson erstellen. Weitere Informationen finden Sie in der Dokumentation.
#include <spng.h>/* Erstellen Sie einen Decoder-Kontext */spng_ctx *ctx = spng_ctx_new(0);/* Legen Sie einen Eingabepuffer fest */spng_set_png_buffer(ctx, buf, buf_size);/* Bestimmen Sie die Ausgabebildgröße */spng_decoded_image_size (ctx, SPNG_FMT_RGBA8, &out_size);/* In 8-Bit-RGBA dekodieren */spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0);/* Freier Kontextspeicher */spng_ctx_free(ctx);/* Das Erstellen eines Encoderkontexts erfordert ein Flag */spng_ctx *enc = spng_ctx_new(SPNG_CTX_ENCODER);/* Encode zum internen Puffer, der von der Bibliothek verwaltet wird */spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1);/* Bildabmessungen angeben, PNG-Format */struct spng_ihdr ihdr ={ .width = Breite, .height = Höhe, .bit_ Depth = 8, .color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA};/* Bild wird gemäß ihdr.color_type, .bit_ Depth codiert */spng_set_ihdr(enc, &ihdr);/* SPNG_FMT_PNG ist ein spezieller Wert, der dem Format in ihdr entspricht, SPNG_ENCODE_FINALIZE finalisiert das PNG mit dem Dateiende-Markierung */spng_encode_image(enc, image, image_size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);/* PNG wird standardmäßig in einen internen Puffer geschrieben */void *png = spng_get_png_buffer(enc, &png_size, &error);/* Der Benutzer besitzt den Puffer nach einem erfolgreichen call */free(png);/* Freier Kontextspeicher */spng_ctx_free(enc);
Siehe Beispiel.c.
Der Code ist unter der BSD 2-Klausel „Simplified“-Lizenz lizenziert.
Das Projekt enthält Optimierungen und Testbilder von libpng, diese sind unter der PNG Reference Library License Version 2 lizenziert.
Der Code wird gemäß den Regeln des CERT C Coding Standards geschrieben. Die gesamte Ganzzahlarithmetik wird auf Überlauf überprüft und alle Fehlerbedingungen werden ordnungsgemäß behandelt.
Die Bibliothek wird kontinuierlich durch OSS-Fuzz gefuzzt, Code wird außerdem mit Clang Static Analyzer, Coverity Scan und PVS-Studio gescannt.
Die Testsuite besteht aus über 1000 Testfällen, 175 Testbilder werden mit allen möglichen Ausgabeformat- und Flag-Kombinationen dekodiert und mit libpng auf Korrektheit verglichen.
Releases folgen dem semantischen Versionierungsschema mit zusätzlichen Garantien:
Versionen von 0.4.0 bis 0.8.x sind stabil
Wenn 1.0.0 wichtige Änderungen einführt, wird 0.8.x als separater stabiler Zweig beibehalten
Derzeit ist geplant, dass 1.0.0 kompatibel ist.
Die Online-Dokumentation ist unter libspng.org/docs verfügbar.
Die Dekodierung in die Ausgabeformate SPNG_FMT_G8
, SPNG_FMT_GA8
und SPNG_FMT_GA16
wird nicht für alle PNG-Farbtyp- und Bittiefenkombinationen unterstützt. Weitere Informationen finden Sie in der Dokumentation.
Die Gammakorrektur ist für die Ausgabeformate SPNG_FMT_PNG
, SPNG_FMT_G8
, SPNG_FMT_GA8
und SPNG_FMT_GA16
nicht implementiert.
Sie können die Entwicklung über OpenCollective sponsern. Die Mittel werden gemäß der Roadmap für die Wartung und Weiterentwicklung verwendet.
Unterstützen Sie dieses Projekt mit Ihrer Organisation. Hier erscheint Ihr Logo mit einem Link zu Ihrer Website. [Beitragen]