#png #codec #image #encoder #decoder #image-encoding #apng

png_pong

一个纯Rust PNG/APNG编解码器

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 图像

Download history 4111/week @ 2024-05-03 7328/week @ 2024-05-10 17452/week @ 2024-05-17 20500/week @ 2024-05-24 27494/week @ 2024-05-31 20010/week @ 2024-06-07 13235/week @ 2024-06-14 7785/week @ 2024-06-21 5370/week @ 2024-06-28 18947/week @ 2024-07-05 34809/week @ 2024-07-12 42545/week @ 2024-07-19 24383/week @ 2024-07-26 39993/week @ 2024-08-02 50831/week @ 2024-08-09 41196/week @ 2024-08-16

每月160,460次下载
14 个crate中(直接使用8个) 使用

Apache-2.0 OR Zlib

140KB
3K SLoC

PNG Pong

一个纯Rust PNG/APNG编解码器

tests docs crates.io

这是一个受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)。然后,我重写了整个库,基于giftpix

目标

  • 禁止使用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-2.0许可定义,应按上述方式双许可,不附加任何其他条款或条件。

在贡献之前,请查看贡献指南,并且,一如既往,请始终遵守行为准则

依赖项

~485KB