lib spng ( simple png ) é uma biblioteca C para leitura e gravação de arquivos no formato Portable Network Graphics (PNG) com foco na segurança e facilidade de uso.
libspng é uma alternativa ao libpng, os projetos são separados e as APIs não são compatíveis.
O objetivo é fornecer uma biblioteca PNG rápida com uma API mais simples que a libpng, que supera a implementação de referência em casos de uso comuns.
Recurso | spng | libpng | stb_image | lodepng |
---|---|---|---|---|
Decodificar do stream | ✅ | ✅ | ✅ | |
Correção gama | ✅ | ✅ | ||
Nenhum bug de segurança conhecido [1] | ✅ | ✅ | ✅ | |
Leitura progressiva de imagem | ✅ | ✅ | ||
Analisa todos os pedaços padrão | ✅ | ✅ | ||
Não requer zlib [2] | ✅ | ✅ | ✅ | |
Codificação | ✅ | ✅ | ✅ | ✅ |
PNG animado | Planejado | ✅ [3] |
[1] O projeto é testado no OSS-Fuzz e as vulnerabilidades são corrigidas antes de se tornarem públicas.
[2] A construção com miniz é suportada.
[3] Com um patch de terceiros
Baixe a versão mais recente e inclua spng.c/spng.h
em seu projeto, você também pode construir com CMake ou Meson, consulte a documentação para detalhes.
#include <spng.h>/* Crie um contexto de decodificador */spng_ctx *ctx = spng_ctx_new(0);/* Defina um buffer de entrada */spng_set_png_buffer(ctx, buf, buf_size);/* Determine o tamanho da imagem de saída */spng_decoded_image_size (ctx, SPNG_FMT_RGBA8, &out_size);/* Decodifica para RGBA de 8 bits */spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0);/* Memória de contexto livre */spng_ctx_free(ctx);/* Criar um contexto de codificador requer um sinalizador */spng_ctx *enc = spng_ctx_new(SPNG_CTX_ENCODER);/* Codificar para buffer interno gerenciado pela biblioteca */spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1);/* Especifique as dimensões da imagem, formato PNG */struct spng_ihdr ihdr ={ .largura = largura, .altura = altura, .bit_profundidade = 8, . marcador de fim de arquivo */spng_encode_image(enc, image, image_size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);/* PNG é gravado em um buffer interno por padrão */void *png = spng_get_png_buffer(enc, &png_size, &error);/* Usuário possui o buffer após uma chamada bem-sucedida */free(png);/* Memória de contexto livre */spng_ctx_free(enc);
Veja exemplo.c.
O código é licenciado sob a licença "Simplificada" de 2 cláusulas BSD.
O projeto contém otimizações e imagens de teste da libpng, licenciadas sob a PNG Reference Library License versão 2.
O código é escrito de acordo com as regras do padrão de codificação CERT C. Toda aritmética de inteiros é verificada quanto a estouro e todas as condições de erro são tratadas normalmente.
A biblioteca é continuamente fuzzed pelo OSS-Fuzz, o código também é digitalizado com Clang Static Analyzer, Coverity Scan e PVS-Studio.
O conjunto de testes consiste em mais de 1.000 casos de teste, 175 imagens de teste são decodificadas com todos os formatos de saída possíveis e combinações de sinalizadores e comparadas com libpng para correção.
As versões seguem o esquema de versionamento semântico com garantias adicionais:
Versões de 0.4.0 a 0.8.x são estáveis
Se 1.0.0 introduzir alterações significativas, então 0.8.x será mantido como um branch estável separado
Atualmente 1.0.0 está planejado para ser compatível.
A documentação online está disponível em libspng.org/docs.
A decodificação para os formatos de saída SPNG_FMT_G8
, SPNG_FMT_GA8
e SPNG_FMT_GA16
não é suportada para todos os tipos de cores PNG e combinações de profundidade de bits, consulte a documentação para obter detalhes.
A correção gama não é implementada para os formatos de saída SPNG_FMT_PNG
, SPNG_FMT_G8
, SPNG_FMT_GA8
e SPNG_FMT_GA16
.
Você pode patrocinar o desenvolvimento através do OpenCollective, os fundos serão usados para manutenção e desenvolvimento adicional de acordo com o roteiro.
Apoie este projeto com sua organização. Seu logotipo aparecerá aqui com um link para seu site. [Contribuir]