#png #decoder #image #no-alloc #graphics #no-std

no-std minipng

无依赖的微型 PNG 解码器

2 个版本

0.1.1 2023 年 9 月 21 日
0.1.0 2023 年 9 月 6 日

246图像

Download history 177/week @ 2024-04-12 798/week @ 2024-04-19 1102/week @ 2024-04-26 895/week @ 2024-05-03 979/week @ 2024-05-10 947/week @ 2024-05-17 1133/week @ 2024-05-24 1099/week @ 2024-05-31 935/week @ 2024-06-07 1624/week @ 2024-06-14 1221/week @ 2024-06-21 1357/week @ 2024-06-28 1281/week @ 2024-07-05 1325/week @ 2024-07-12 1735/week @ 2024-07-19 1551/week @ 2024-07-26

6,057 每月下载量
用于 egui_minipng

0BSD 许可证

4.5MB
1K SLoC

minipng

crates.io 页面 · 仓库

无依赖的微型 Rust PNG 解码器(甚至不包括 stdalloc),并且代码大小小巧(例如,比 png crate 小 8 倍以上 .wasm.gz 大小——见 check-size.sh)。

目标

  • 正确解码所有有效的非交错 PNG 文件(在 ≤32 位平台上,一些非常大的图像可能会因为 usize::MAX 而失败)。
  • 小的代码大小和复杂性
  • 除了 core 之外没有其他依赖
  • 没有 panic
  • 最小的不安全代码

非目标

  • Adam7 交错(会增加代码复杂度,而交错 PNG 很少见)
  • 为了速度而牺牲代码大小/复杂性
  • 检查块 CRC(会增加代码复杂度,而且已经存在 IDAT 块的 Adler32 校验和)
  • 辅助块(tEXt、iCCP 等)
  • 正确处理带有 tRNS 块的非索引图像(谁会用这个?)
  • 动画 PNG

示例使用

基本使用

let mut buffer = vec![0; 1 << 20]; // hope this is big enough!
let png = &include_bytes!("../examples/image.png")[..];
let image = minipng::decode_png(png, &mut buffer).expect("bad PNG");
println!("{}×{} image", image.width(), image.height());
let pixels = image.pixels();
println!("top-left pixel is #{:02x}{:02x}{:02x}", pixels[0], pixels[1], pixels[2]);
// (^ this only works for RGB(A) 8bpc images)

更复杂的示例,它分配正确的字节数并处理所有颜色格式

let png = &include_bytes!("../examples/image.png")[..];
let header = minipng::decode_png_header(png).expect("bad PNG");
let mut buffer = vec![0; header.required_bytes_rgba8bpc()];
let mut image = minipng::decode_png(png, &mut buffer).expect("bad PNG");
image.convert_to_rgba8bpc();
println!("{}×{} image", image.width(), image.height());
let pixels = image.pixels();
println!("top-left pixel is #{:02x}{:02x}{:02x}{:02x}", pixels[0], pixels[1], pixels[2], pixels[3]);

功能

  • adler(默认:禁用)——检查 Adler-32 校验和。略微增加代码大小并略微降低性能,但可以验证 PNG 文件的完整性。

开发

提供了一个 pre-commit git 钩子,用于运行 cargo fmtcargo clippy。您可以使用以下命令安装它:

ln -s ../../pre-commit .git/hooks/

测试

测试目录 test 中的所有 PNG 文件都通过 cargo t 进行测试(注意:cargo test 由于无法动态生成测试且默认无法启用 --nocapture,所以进度日志较少 抱怨抱怨)。

性能

基准测试(见 cargo bench)显示,对于大图像,minipng 比依赖库 png 慢约 50%,但对于小图像则更快。

许可证

零条款BSD许可证

在此授予使用、复制、修改和/或以任何目的(包括但不限于)分发此软件的许可,无论是否收取费用。

软件按“原样”提供,且作者对软件及其包括所有默示的适销性和适用性保证不予承认。在任何情况下,作者均不对任何特殊、直接、间接或后果性损害或任何因使用或性能此软件而导致的损害(包括但不限于使用、数据或利润的损失)承担责任,无论这些损害是由于合同行为、疏忽还是其他侵权行为引起的,无论这些损害是否与使用或性能此软件有关。

无运行时依赖项