17个版本 (9个重大更新)
0.9.2 | 2024年8月10日 |
---|---|
0.9.1 | 2024年4月4日 |
0.8.2 | 2021年5月18日 |
0.8.0 | 2021年2月15日 |
0.0.1 | 2019年7月25日 |
#38 in 图像
每月160,460次下载
在 14 个crate中(直接使用8个) 使用
140KB
3K SLoC
一个纯Rust PNG/APNG编解码器
这是一个受lodepng启发的纯Rust PNG图像编解码器,允许在不使用任何系统依赖项的情况下轻松读取和写入PNG文件。
为什么还需要另一个PNG crate?
以下是我所知的4个Rust PNG编解码器crate
- png - 每个人都在使用(曾经能够加载比png_pong更少的PNG文件,速度也较慢,但现在已经赶上了)。
- lodepng - 加载所有PNG文件,代码是从C语言移植过来的,因此代码难以阅读和维护,同时也使用了较慢的deflate/inflate算法实现。
- imagefmt - 已被遗弃,并且能够打开的文件类型有限,但代码行数较少。
- imagine - 仅支持PNG解码。
最初,我基于imagefmt创建了aci_png,并打算添加更多功能。当时,我不想从头开始编写PNG编解码器,因此我决定使用具有更多功能(以及更多底层功能)的lodepng
,并清理代码,升级到Rust 2018版,依赖miniz_oxide crate(因为它比lodepng的INFLATE实现解压更快)并摆脱libc依赖,使其真正成为纯Rust(lodepng声称是,但调用了C语言的malloc和free)。然后,我重写了整个库,基于gift和pix。
目标
- 禁止使用unsafe。
- 以迭代器的方式支持APNG。
- 快速。
- 与pix / gift风格的API兼容。
- 加载所有用pngcrush压缩的PNG文件。
- 保存压缩的PNG文件。
- 代码清晰、文档完善、简洁。
- 实现PNG 1.2规范中所有已完成且非弃用的块,包括PNG 1.2规范、PNG 1.2扩展和APNG规范
待办事项
- 实现APNG读取。
- 实现块读取(使用所有不同的块结构)。
- StepDecoder应包装StepDecoder,RasterEncoder应包装ChunkEncoder
- 更多测试用例进行测试。
基准测试和比较
待办事项:更新,在较旧的png_pong和Rust 1.52.1上运行
使用Rust 1.52.1,criterion和4种不同的PNG大小,从"./tests/png/"中的PNGs(单位为:us / 微秒)。我停止了预测将花费超过半小时的所有操作,并使用criterion的消息“TIMEOUT”。
- sRGB 1x1:使用
tests/png/profile.png
- sRGBA 1x1:使用
tests/png/test.png
- sRGB 64x64:使用
test/png/4.png
- sRGBA 64x64:使用
tests/png/res.png
- sRGB 256x256:
tests/png/PngSuite.png
- sRGBA 256x256:使用
tests/png/icon.png
- sRGB 4096x4096:
tests/png/plopgrizzly.png
- sRGBA 4096x4096:使用
tests/png/noise.png
编码器
库 | sRGB 1x1 | sRGBA 1x1 | sRGB 64x64 | sRGBA 64x64 | sRGB 256x256 | sRGBA 256x256 | sRGB 4096x4096 | sRGBA 4096x4096 |
---|---|---|---|---|---|---|---|---|
png_pong | 41.956 | 8.2661 | 1_025.7 | 700.80 | 2_646.1 | 5_061.5 | 587_320 | 3_587_100 |
png | 29.538 | 9.4122 | 213.49 | 203.02 | 944.99 | 1_534.3 | 201_680 | 1_535_300 |
lodepng | 59.989 | 10.700 | 1_399.3 | 982.63 | 3_391.3 | 6_664.7 | 831_190 | 3_394_900 |
imagefmt | 8.7942 | 8.7399 | 211.01 | 177.82 | 901.22 | 1_569.4 | 218_550 | 1_285_700 |
imagine | --- | --- | --- | --- | --- | --- | --- | --- |
aci_png | 失败 | 30.987 | 失败 | 289.24 | 失败 | 2_298.1 | 失败 | 2_135_400 |
libpng-sys | 6.8443 | 2.9461 | 1_613.5 | 769.70 | 2_261.1 | 4_745.2 | 520_770 | 2_926_900 |
解码器
库 | sRGB 1x1 | sRGBA 1x1 | sRGB 64x64 | sRGBA 64x64 | sRGB 256x256 | sRGBA 256x256 | sRGB 4096x4096 | sRGBA 4096x4096 |
---|---|---|---|---|---|---|---|---|
png_pong | 7.7520 | 3.9459 | 77.981 | 99.384 | 752.95 | 901.98 | 178_880 | 570_200 |
png | 8.1195 | 6.6107 | 54.834 | 71.873 | 643.09 | 686.29 | 128_000 | 355_080 |
lodepng | 5.8958 | 5.4527 | 77.050 | 97.762 | 882.83 | 982.76 | 230_570 | 563_210 |
imagefmt | 4.2864 | 4.8706 | 74.715 | 82.026 | 566.86 | 758.27 | 69_465 | 545_060 |
imagine | 2.8809 | 0.44822 | 3_202.3 | 2_266.4 | 2_056.1 | 10_753 | 442_750 | 27_944_000 |
aci_png | 5.0243 | 4.3516 | 201.29 | 174.30 | 1_500.6 | 1_689.8 | 398_340 | 1_323_600 |
libpng-sys | 3.6011 | 0.48747 | 1.8175 | 0.67344 | 25.809 | 4.4175 | 19_400 | 18_262 |
目录
API
API文档可在docs.rs上找到。
功能
没有可选功能。
升级
您可以使用变更日志来方便地升级此crate作为依赖项。
MSRV
当前的MSRV是Rust 1.70。
MSRV根据Ardaku MSRV指南进行更新。
许可
版权所有 © 2019-2024 PNG Pong Crate贡献者
许可方式任选其一
- Apache License,版本2.0,(LICENSE-APACHE或http://apache.ac.cn/licenses/LICENSE-2.0)
- Zlib License,(LICENSE-ZLIB或https://opensource.org/licenses/Zlib)
。
贡献
除非您明确表示,否则您提交给作品以包含在内的任何贡献,根据Apache-2.0许可定义,应按上述方式双许可,不附加任何其他条款或条件。
依赖项
~485KB