10 个版本
新 0.2.0-alpha.3 | 2024年8月22日 |
---|---|
0.2.0-alpha.2 | 2021年8月28日 |
0.2.0-alpha.1 | 2021年6月24日 |
0.1.0 | 2021年3月14日 |
0.1.0-alpha.3 | 2020年3月14日 |
350 在 图像 中排名
每月 下载 108 次
用于 zune-png
380KB
10K SLoC
spng-rs
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.9–1.2MB
~23K SLoC