2 个版本
0.1.1 | 2023 年 9 月 21 日 |
---|---|
0.1.0 | 2023 年 9 月 6 日 |
246 在 图像
6,057 每月下载量
用于 egui_minipng
4.5MB
1K SLoC
minipng
无依赖的微型 Rust PNG 解码器(甚至不包括 std
或 alloc
),并且代码大小小巧(例如,比 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 fmt
和 cargo clippy
。您可以使用以下命令安装它:
ln -s ../../pre-commit .git/hooks/
测试
测试目录 test
中的所有 PNG 文件都通过 cargo t
进行测试(注意:cargo test
由于无法动态生成测试且默认无法启用 --nocapture
,所以进度日志较少 抱怨抱怨)。
性能
基准测试(见 cargo bench
)显示,对于大图像,minipng
比依赖库 png
慢约 50%,但对于小图像则更快。
许可证
零条款BSD许可证
在此授予使用、复制、修改和/或以任何目的(包括但不限于)分发此软件的许可,无论是否收取费用。
软件按“原样”提供,且作者对软件及其包括所有默示的适销性和适用性保证不予承认。在任何情况下,作者均不对任何特殊、直接、间接或后果性损害或任何因使用或性能此软件而导致的损害(包括但不限于使用、数据或利润的损失)承担责任,无论这些损害是由于合同行为、疏忽还是其他侵权行为引起的,无论这些损害是否与使用或性能此软件有关。