Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/aloucks/spng-rs
Rust bindings to libspng
https://github.com/aloucks/spng-rs
libspng png rust spng
Last synced: 3 months ago
JSON representation
Rust bindings to libspng
- Host: GitHub
- URL: https://github.com/aloucks/spng-rs
- Owner: aloucks
- License: other
- Created: 2020-03-13T23:53:12.000Z (almost 5 years ago)
- Default Branch: master
- Last Pushed: 2024-01-16T18:54:58.000Z (12 months ago)
- Last Synced: 2024-04-24T20:03:11.240Z (8 months ago)
- Topics: libspng, png, rust, spng
- Language: Rust
- Homepage:
- Size: 112 KB
- Stars: 14
- Watchers: 3
- Forks: 1
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE-APACHE
Awesome Lists containing this project
README
# spng-rs
[![crates.io](https://img.shields.io/crates/v/spng.svg)](https://crates.io/crates/spng)
[![docs.rs](https://docs.rs/spng/badge.svg)](https://docs.rs/spng)
[![tests](https://github.com/aloucks/spng-rs/actions/workflows/tests.yml/badge.svg)](https://github.com/aloucks/spng-rs/actions/workflows/tests.yml)Rust bindings to [libspng].
## Version
| spng-rs | libspng |
|-----------------|---------------------------------------------------------------------------------------------|
| `0.2.0-alpha.3` | [`0.7.4`](https://github.com/randy408/libspng/tree/v0.7.4) |
| `0.2.0-alpha.2` | [`0.7.0-rc2`](https://github.com/randy408/libspng/tree/v0.7.0-rc2) |
| `0.2.0-alpha.1` | [`0.7.0-rc2`](https://github.com/randy408/libspng/tree/v0.7.0-rc2) |
| `0.1.0` | [`0.6.3`](https://github.com/randy408/libspng/tree/264476a1521bcb1d526c05ece0ed68b855fcfc4c) |## Performance
This [test image] is decoded ~ 3-5x faster than with the [png] crate.
```
png_decode time: [1.7354 ms 1.7372 ms 1.7392 ms]
spng_decode time: [569.27 µs 570.86 µs 572.45 µs]
spng_decode time: [311.84 µs 312.45 µs 313.13 µs] (--features=zlib-ng)
```## Examples
A one-liner for simple use cases:
```rust
let file = File::open("image.png")?;
let (out_info, data) = spng::decode(file, spng::Format::Rgba8)?;assert_eq!(300, out_info.width);
assert_eq!(300, out_info.height);
assert_eq!(8, out_info.bit_depth);
assert_eq!(4, out_info.color_type.samples());
assert_eq!(out_info.buffer_size, output_buffer_size);
```The `Decoder` interface is modeled after the [png] crate:
```rust
let file = File::open("image.png")?;
let decoder = spng::Decoder::new(file)
.with_output_format(spng::Format::Rgba8);
let (out_info, mut reader) = decoder.read_info()?;
let out_buffer_size = reader.output_buffer_size();
let mut data = vec![0; out_buffer_size];
reader.next_frame(&mut data)?;assert_eq!(300, out_info.width);
assert_eq!(300, out_info.height);
assert_eq!(8, out_info.bit_depth);
assert_eq!(4, out_info.color_type.samples());
assert_eq!(out_info.buffer_size, out_buffer_size);
```The `RawContext` interface is a safe and minimal wrapper over the full [libspng] `C` API.
```rust
let file = File::open("image.png")?;
let out_format = spng::Format::Rgba8;
let mut ctx = spng::raw::RawContext::new()?;
ctx.set_png_stream(file)?;
let ihdr = ctx.get_ihdr()?;
let out_buffer_size = ctx.decoded_image_size(out_format)?;
let mut data = vec![0; out_buffer_size];
ctx.decode_image(&mut data, out_format, spng::DecodeFlags::empty())?;assert_eq!(300, ihdr.width);
assert_eq!(300, ihdr.height);
assert_eq!(8, ihdr.bit_depth);
assert_eq!(4, spng::ColorType::try_from(ihdr.color_type)?.samples());
```[png]: https://crates.io/crates/png
[libspng]: https://libspng.org
[test image]: spng/tests/test-002.png