Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/randy408/libspng
Simple, modern libpng alternative
https://github.com/randy408/libspng
c c99 cmake codec decoding encoder libpng meson optimized oss-fuzz png png-decoder png-encoder spng
Last synced: 2 days ago
JSON representation
Simple, modern libpng alternative
- Host: GitHub
- URL: https://github.com/randy408/libspng
- Owner: randy408
- License: bsd-2-clause
- Created: 2018-03-28T10:39:20.000Z (almost 7 years ago)
- Default Branch: master
- Last Pushed: 2024-06-15T13:27:26.000Z (7 months ago)
- Last Synced: 2025-01-02T03:10:24.566Z (10 days ago)
- Topics: c, c99, cmake, codec, decoding, encoder, libpng, meson, optimized, oss-fuzz, png, png-decoder, png-encoder, spng
- Language: C
- Homepage: https://libspng.org
- Size: 942 KB
- Stars: 755
- Watchers: 29
- Forks: 74
- Open Issues: 75
-
Metadata Files:
- Readme: README.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Security: SECURITY.md
Awesome Lists containing this project
- awesome-game-engine-dev - Libspng - Simple, modern libpng alternative. (Libraries / C)
README
[![Gitter](https://badges.gitter.im/libspng/community.svg)](https://gitter.im/libspng/community?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge)
[![Financial Contributors on Open Collective](https://opencollective.com/libspng/all/badge.svg?label=financial+contributors)](https://opencollective.com/libspng)
[![Fuzzing Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/libspng.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html#libspng)
[![Coverity](https://scan.coverity.com/projects/15336/badge.svg)](https://scan.coverity.com/projects/randy408-libspng)
[![tag](https://img.shields.io/github/tag-date/randy408/libspng.svg)](https://libspng.org/download)# libspng
lib**spng** (**s**imple **png**) 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](https://github.com/glennrp/libpng/blob/libpng16/png.h),
it outperforms the reference implementation in common use cases.## Performance
![](https://libspng.org/perfx86.png)
## Features
| Feature | spng | libpng | stb_image | lodepng |
|--------------------------------------|---------|--------------------|-----------|---------|
| Decode from stream | ✅ | ✅ | ✅ | ❌ |
| Gamma correction | ✅ | ✅ | ❌ | ❌ |
| No known security bugs[1] | ✅ | ✅ | ❌ | ✅ |
| Progressive image read | ✅ | ✅ | ❌ | ❌ |
| Parses all standard chunks | ✅ | ✅ | ❌ | ❌ |
| Doesn't require zlib[2] | ✅ | ❌ | ✅ | ✅ |
| Encoding | ✅ | ✅ | ✅ | ✅ |
| Animated PNG | Planned | ✅[3] | ❌ | ❌ |[1] The project is fuzz tested on [OSS-Fuzz](https://github.com/google/oss-fuzz) and vulnerabilities are fixed before they become public.
[2] Building with miniz is [supported](docs/build.md#miniz).
[3] With a 3rd party patch
## Getting spng
Download the [latest release](https://libspng.org/download) and include `spng.c/spng.h` in your project,
you can also build with CMake or Meson, refer to the [documentation](docs/build.md) for details.## Usage
```c
#include/* Create a decoder 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);/* Creating an encoder context requires a flag */
spng_ctx *enc = spng_ctx_new(SPNG_CTX_ENCODER);/* Encode to internal buffer managed by the library */
spng_set_option(enc, SPNG_ENCODE_TO_BUFFER, 1);/* Specify image dimensions, PNG format */
struct spng_ihdr ihdr =
{
.width = width,
.height = height,
.bit_depth = 8,
.color_type = SPNG_COLOR_TYPE_TRUECOLOR_ALPHA
};/* Image will be encoded according to ihdr.color_type, .bit_depth */
spng_set_ihdr(enc, &ihdr);/* SPNG_FMT_PNG is a special value that matches the format in ihdr,
SPNG_ENCODE_FINALIZE will finalize the PNG with the end-of-file marker */
spng_encode_image(enc, image, image_size, SPNG_FMT_PNG, SPNG_ENCODE_FINALIZE);/* PNG is written to an internal buffer by default */
void *png = spng_get_png_buffer(enc, &png_size, &error);/* User owns the buffer after a successful call */
free(png);/* Free context memory */
spng_ctx_free(enc);
```See [example.c](examples/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](http://www.libpng.org/pub/png/src/libpng-LICENSE.txt).## Security & Testing
Code is written according to the rules of the
[CERT C Coding Standard](https://wiki.sei.cmu.edu/confluence/display/c/SEI+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](https://github.com/google/oss-fuzz),
code is also scanned with Clang Static Analyzer, Coverity Scan and PVS-Studio.The test suite consists of over 1000 test cases,
175 [test images](http://www.schaik.com/pngsuite/) are decoded with all possible
output format and flag combinations and compared against libpng for [correctness](tests/README.md#Correctness).## Versioning
Releases follow the [semantic versioning](https://semver.org/) scheme with additional guarantees:
* Releases from 0.4.0 to 0.8.x are stable
* If 1.0.0 will introduce breaking changes then 0.8.x will be maintained as a separate stable branchCurrently 1.0.0 is planned to be [compatible](https://github.com/randy408/libspng/issues/3).
## Documentation
Online documentation is available at [libspng.org/docs](https://libspng.org/docs).
## Known Issues
* Decoding to `SPNG_FMT_G8`, `SPNG_FMT_GA8` and `SPNG_FMT_GA16` output formats is not supported
for all PNG color type and bit depth combinations, see documentation for details.
* Gamma correction is not implemented for `SPNG_FMT_PNG`, `SPNG_FMT_G8`, `SPNG_FMT_GA8`
and `SPNG_FMT_GA16` output formats.## Supporting spng
You can sponsor development through [OpenCollective](https://opencollective.com/libspng/), funds will be used for maintenance and further development according to the [roadmap](https://github.com/randy408/libspng/milestones).
### OpenCollective backers
#### Individuals
#### Organizations
Support this project with your organization. Your logo will show up here with a link to your website. [[Contribute](https://opencollective.com/libspng/contribute)]