lib spng ( s simple png ) es una biblioteca C para leer y escribir archivos en formato de gráficos de red portátiles (PNG) centrándose en la seguridad y la facilidad de uso.
libspng es una alternativa a libpng, los proyectos están separados y las API no son compatibles.
El objetivo es proporcionar una biblioteca PNG rápida con una API más simple que libpng, que supera la implementación de referencia en casos de uso comunes.
Característica | spng | libpng | imagen_stb | lodepng |
---|---|---|---|---|
Decodificar de la secuencia | ✅ | ✅ | ✅ | |
Corrección gamma | ✅ | ✅ | ||
No se conocen errores de seguridad [1] | ✅ | ✅ | ✅ | |
Lectura de imagen progresiva | ✅ | ✅ | ||
Analiza todos los fragmentos estándar | ✅ | ✅ | ||
No requiere zlib [2] | ✅ | ✅ | ✅ | |
Codificación | ✅ | ✅ | ✅ | ✅ |
PNG animado | Planificado | ✅ [3] |
[1] El proyecto se prueba en OSS-Fuzz y las vulnerabilidades se solucionan antes de que se hagan públicas.
[2] Se admite la construcción con miniz.
[3] Con un parche de terceros
Descargue la última versión e incluya spng.c/spng.h
en su proyecto; también puede compilar con CMake o Meson; consulte la documentación para obtener más detalles.
#include <spng.h>/* Crear un contexto de decodificador */spng_ctx *ctx = spng_ctx_new(0);/* Establecer un búfer de entrada */spng_set_png_buffer(ctx, buf, buf_size);/* Determinar el tamaño de la imagen de salida */spng_decoded_image_size (ctx, SPNG_FMT_RGBA8, &out_size);/* Decodificar a RGBA de 8 bits */spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0);/* Memoria de contexto libre */spng_ctx_free(ctx);/* La creación de un contexto de codificador requiere una bandera */spng_ctx *enc = spng_ctx_new(SPNG_CTX_ENCODER);/* Codificar al buffer interno administrado por la biblioteca */spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1);/* Especificar dimensiones de la imagen, formato PNG */struct spng_ihdr ihdr ={ .ancho = ancho, .altura = altura, .bit_profundidad = 8, .color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA};/* La imagen se codificará según ihdr.color_type, .bit_ Depth */spng_set_ihdr(enc, &ihdr);/* SPNG_FMT_PNG es un valor especial que coincide con el formato en ihdr, SPNG_ENCODE_FINALIZE finalizará el PNG con el marcador de fin de archivo */spng_encode_image(enc, image, image_size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);/* PNG se escribe en un búfer interno de forma predeterminada */void *png = spng_get_png_buffer(enc, &png_size, &error);/* El usuario es propietario del búfer después de una ejecución exitosa call */free(png);/* Memoria de contexto libre */spng_ctx_free(enc);
Ver ejemplo.c.
El código tiene la licencia "simplificada" de 2 cláusulas BSD.
El proyecto contiene optimizaciones e imágenes de prueba de libpng, que tienen la licencia de biblioteca de referencia PNG versión 2.
El código está escrito de acuerdo con las reglas del estándar de codificación CERT C. Toda la aritmética de números enteros se verifica para detectar desbordamientos y todas las condiciones de error se manejan correctamente.
OSS-Fuzz actualiza continuamente la biblioteca y el código también se escanea con Clang Static Analyzer, Coverity Scan y PVS-Studio.
El conjunto de pruebas consta de más de 1000 casos de prueba, 175 imágenes de prueba se decodifican con todos los formatos de salida posibles y combinaciones de indicadores y se comparan con libpng para determinar su corrección.
Las versiones siguen el esquema de versiones semánticas con garantías adicionales:
Las versiones de 0.4.0 a 0.8.x son estables
Si 1.0.0 introduce cambios importantes, entonces 0.8.x se mantendrá como una rama estable separada.
Actualmente está previsto que la versión 1.0.0 sea compatible.
La documentación en línea está disponible en libspng.org/docs.
La decodificación a formatos de salida SPNG_FMT_G8
, SPNG_FMT_GA8
y SPNG_FMT_GA16
no es compatible con todas las combinaciones de tipo de color y profundidad de bits PNG; consulte la documentación para obtener más detalles.
La corrección gamma no está implementada para los formatos de salida SPNG_FMT_PNG
, SPNG_FMT_G8
, SPNG_FMT_GA8
y SPNG_FMT_GA16
.
Puede patrocinar el desarrollo a través de OpenCollective, los fondos se utilizarán para el mantenimiento y el desarrollo posterior de acuerdo con la hoja de ruta.
Apoye este proyecto con su organización. Su logotipo aparecerá aquí con un enlace a su sitio web. [Contribuir]