10 个版本

0.2.0-alpha.3 2024 年 8 月 22 日
0.2.0-alpha.22021 年 8 月 28 日
0.2.0-alpha.12021 年 6 月 24 日
0.1.0 2021 年 3 月 14 日
0.1.0-alpha.32020 年 3 月 14 日

#766图像

Download history 17/week @ 2024-04-29 104/week @ 2024-05-06 2/week @ 2024-05-13 10/week @ 2024-05-20 25/week @ 2024-05-27 131/week @ 2024-06-03 21/week @ 2024-06-10 39/week @ 2024-06-24 6/week @ 2024-07-01 83/week @ 2024-07-08 18/week @ 2024-07-15 57/week @ 2024-07-22 38/week @ 2024-07-29 4/week @ 2024-08-05 9/week @ 2024-08-12

每月 113 次下载
2 个 crate 中使用 (通过 spng)

MIT/Apache

335KB
9K SLoC

C 7K SLoC // 0.0% comments Rust 2K SLoC // 0.0% comments Shell 35 SLoC // 0.1% comments C++ 14 SLoC

spng-rs

crates.io docs.rs tests

Rust 对 libspng 的绑定。

版本

spng-rs libspng
未发布 0.7.4
0.2.0-alpha.2 0.7.0-rc2
0.2.0-alpha.1 0.7.0-rc2
0.1.0 0.6.3

性能

这个 测试图像png crate 相比解码速度快 3-5 倍。

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)

示例

简单用例的一行代码

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);

Decoder 接口模仿了 png crate

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);

RawContext 接口是对完整的 libspng C API 的安全且最简封装。

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());

依赖项

~0.8–1MB
~21K SLoC