libspng
libspng is a C library for reading and writing Portable Network Graphics (PNG) format files with a focus on security and ease of use.
libspng is an alternative to libpng, the projects are separate and the APIs are not compatible.
Motivation
The goal is to provide a fast PNG library with a simpler API than libpng.
Performance
Features
Feature | libspng | libpng | stb_image | lodepng |
---|---|---|---|---|
Decode to RGBA8/16 | ✓ | ✓ | ✓ | ✓ |
Decode from stream | ✓ | ✓ | ✓ | ❌ |
Gamma correction | ✓ | ✓ | ❌ | ❌ |
Fuzzed by OSS-Fuzz | ✓ | ✓ | ❌ | ✓ |
Progressive read | ❌* | ✓ | ❌ | ❌ |
Doesn't require zlib | ❌ | ❌ | ✓ | ✓ |
Encoding | ❌* | ✓ | ✓ | ✓ |
Animated PNG | ❌* | ✓** | ❌ | ❌ |
* Feature in planning phase
** With a 3rd party patch
Getting spng
Download the latest release and include spng.c/spng.h
in your project,
you can also build with CMake or Meson. Refer to the documentation for details.
Usage
/* Create a context */
spng_ctx *ctx = spng_ctx_new(0);
/* Set an input buffer */
spng_set_png_buffer(ctx, buf, buf_size);
/* Determine output image size */
spng_decoded_image_size(ctx, SPNG_FMT_RGBA8, &out_size);
/* Decode to 8-bit RGBA */
spng_decode_image(ctx, out, out_size, SPNG_FMT_RGBA8, 0);
/* Free context memory */
spng_ctx_free(ctx);
See example.c.
License
Code is licensed under the BSD 2-clause "Simplified" License.
The project contains optimizations and test images from libpng, these are licensed under the PNG Reference Library License version 2.
Security & Testing
Code is written according to the rules of the CERT C Coding Standard. All integer arithmetic is checked for overflow and all error conditions are handled gracefully.
The library is continuously fuzzed by OSS-Fuzz, releases are scanned with Clang Static Analyzer, PVS-Studio, and Coverity Scan.
The test suite consists of over 700 test cases, 175 test images are decoded with all possible output format and flag combinations and compared against libpng for correctness.
Versioning
Releases follow the semantic versioning scheme with a few exceptions:
- Releases from 0.4.0 to 0.8.x are stable
- 0.8.x will be maintained as a separate release branch from 1.0.0
Note that 1.0.0 will introduce little to no breaking changes.
Documentation
Online documentation is available at libspng.org/docs.
Known Issues
- Text and iCCP chunks are not read.
-
spng_crc_set_action()
is partially implemented,SPNG_CRC_DISCARD
has no effect.