72 个版本 (35 个稳定版)
9.1.2 | 2024 年 7 月 12 日 |
---|---|
9.0.0 | 2023 年 10 月 10 日 |
8.0.0 | 2022 年 12 月 24 日 |
7.0.0 | 2022 年 12 月 7 日 |
0.2.2 | 2016 年 3 月 21 日 |
#12 in 压缩
18,955 每月下载量
用于 31 个包 (17 直接使用)
195KB
4.5K SLoC
Oxipng
概述
Oxipng 是一个多线程的无损 PNG/APNG 压缩优化器。它可以通过命令行界面或作为其他 Rust 程序中的库来使用。
安装
Windows 版的 Oxipng 可以从 GitHub 页面的 发布 链接下载。
对于 MacOS 或 Linux,如果可能的话,建议从您的发行版软件仓库中安装。Oxipng 已知为以下环境打包。
或者,可以使用以下命令通过 Cargo 安装 oxipng:
cargo install oxipng
Oxipng 可以使用最新稳定的或夜间的 Rust 版本从源代码构建。这对于在 Oxipng 上进行开发非常有用。
git clone https://github.com/shssoichiro/oxipng.git
cd oxipng
cargo build --release
cp target/release/oxipng /usr/local/bin
当前支持的最小 Rust 版本是 1.74.0。
Oxipng 遵循语义版本控制。
用法
Oxipng 是一个命令行实用工具。以下是一个适用于 Web 的示例用法:
oxipng -o 4 --strip safe --alpha *.png
最常用的选项如下:
- 优化:从
-o 0
到-o 6
(或-o max
),数值越低速度越快,数值越高压缩效果越好。默认值 (-o 2
) 非常快且提供良好的压缩效果。更高的级别可能会有显著的改善,但通常会有越来越小的回报。 - Strip:用于从处理过的图像中移除元数据信息。通过
--strip [safe,all]
使用。如果不需要元数据,可以节省几千字节。"Safe"只移除永远不会影响图像渲染的元数据。"All"移除所有非关键元数据。您还可以传递一个要删除的特定元数据块的逗号分隔列表。-s
可以用作--strip safe
的简写。 - Alpha:通过改变完全透明像素的颜色值,
--alpha
可以提高具有透明度的图像的压缩效果。这通常推荐使用,但请注意,这实际上是损失性的转换,可能不适合某些特定应用。
运行oxipng --help
或在此处查看更多高级选项。
某些选项既有简短(如-a
)也有长(如--alpha
)形式。您使用哪种形式只是个人喜好问题。可以将多个简短选项组合在一起,例如:-savvo6
等同于--strip safe --alpha --verbose --verbose --opt 6
。注意,所有选项都是大小写敏感的。
通过pre-commit进行Git集成
创建一个类似于下面的.pre-commit-config.yaml
文件,或者将以下行添加到现有的repos
映射前缀中
repos:
- repo: https://github.com/shssoichiro/oxipng
rev: v9.0.0
hooks:
- id: oxipng
args: ["-o", "4", "--strip", "safe", "--alpha"]
通过Trunk进行Git集成
Trunk是一个可扩展的超检查器,可以用于在将PNG文件提交到Git仓库时自动优化它们,或者根据它们是否已优化来阻止将PNG文件添加到Git仓库。trunk的oxipng集成在此处。
通过trunk启用oxipng
# to get the latest version:
trunk check enable oxipng
# to get a specific version:
trunk check enable [email protected]
或修改您的仓库中的.trunk/trunk.yaml
以包含
lint:
enabled:
- oxipng@9.0.0
然后只需运行
# to optimize a png:
trunk fmt <file>
# to check if a png is already optimized:
trunk check <file>
您可以设置trunk以管理您的git hooks,并在您执行git commit
操作时自动优化任何提交到git的png
文件。要启用此功能,请运行
trunk actions enable trunk-fmt-pre-commit
库使用
虽然最初是作为可执行文件设计的,但oxipng也可以作为库在其他Rust项目中使用。要这样做,只需在Cargo.toml中将oxipng作为依赖项添加,然后在项目中添加extern crate oxipng
。然后您应该可以访问此处记录的所有库函数。最简单的使用方法涉及创建一个Options结构体,并将其与输入文件名一起传递到optimize函数。
建议在将 oxipng 作为库包含时禁用 "binary" 功能。目前,在 Cargo 中没有简单的方法来单独禁用一项功能,只能通过禁用默认功能并指定所需的功能来实现,例如:oxipng = { version = "9.0", features = ["parallel", "zopfli", "filetime"], default-features = false }
历史
Oxipng 是 OptiPNG 项目的完整重写,OptiPNG 自 2014 年 3 月以来没有提交,因此被认为已经停止开发。(OptiPNG 在 Oxipng 首次发布后发布了新版本。)为了避免混淆和潜在的法律问题,名称已更改。
重写 OptiPNG 的核心目标是实现多线程,这在 OptiPNG 现有的 C 代码库中非常困难。这也提供了一个机会来选择更现代、更安全的语言(Rust)。
请注意,虽然类似,但 Oxipng 并不是 OptiPNG 的直接替代品。如果您正在从 OptiPNG 迁移,请在使用之前查看 帮助。
贡献
欢迎任何贡献,将通过 GitHub 上的拉取请求接受。可以通过 GitHub 的问题报告提交错误报告。请尽可能提供详细信息。如果您有能力在错误报告中提交修复,则建议您通过拉取请求进行,但您不需要是 Rust 开发者即可贡献。其他贡献(如改进文档或翻译)也欢迎通过 GitHub 进行。
许可
Oxipng 是开源软件,根据 MIT 许可证发布。
基准测试
在 Linux 6.5.0-2-amd64 内核,Intel Core i7-12700 CPU(8 个性能核心、4 个效率核心、20 个线程)、DDR5-5200 RAM 双通道配置下,测试了 OxiPNG 9.0.0(提交 c16519b38b0519988db625913be919d4f0e42f5d
,使用 rustc 1.74.0-nightly (7b4d9e155 2023-09-28)
编译)与 Debian 不稳定版打包的 OptiPNG 版本 0.7.7 进行比较。
Benchmark 1: ./target/release/oxipng -P ./tests/files/rgb_16_should_be_grayscale_8.png
Time (mean ± σ): 59.6 ms ± 7.7 ms [User: 77.4 ms, System: 3.6 ms]
Range (min … max): 53.3 ms … 89.9 ms 32 runs
Benchmark 2: optipng -simulate ./tests/files/rgb_16_should_be_grayscale_8.png
Time (mean ± σ): 132.4 ms ± 0.8 ms [User: 132.5 ms, System: 0.6 ms]
Range (min … max): 131.8 ms … 134.4 ms 22 runs
Summary
./target/release/oxipng -P ./tests/files/rgb_16_should_be_grayscale_8.png ran
2.22 ± 0.29 times faster than optipng -simulate ./tests/files/rgb_16_should_be_grayscale_8.png
Benchmark 1: ./target/release/oxipng -o4 -P ./tests/files/rgb_16_should_be_grayscale_8.png
Time (mean ± σ): 88.7 ms ± 4.3 ms [User: 270.3 ms, System: 11.0 ms]
Range (min … max): 86.8 ms … 109.4 ms 26 runs
Benchmark 2: optipng -o 4 -simulate ./tests/files/rgb_16_should_be_grayscale_8.png
Time (mean ± σ): 444.9 ms ± 0.3 ms [User: 444.8 ms, System: 0.7 ms]
Range (min … max): 444.4 ms … 445.6 ms 10 runs
Summary
./target/release/oxipng -o4 -P ./tests/files/rgb_16_should_be_grayscale_8.png ran
5.01 ± 0.25 times faster than optipng -o 4 -simulate ./tests/files/rgb_16_should_be_grayscale_8.png
旧基准测试
在 AMD Ryzen 7 4800H、Radeon 图形、16 个逻辑核心上,使用 rustc 1.55.0-nightly(7a16cfcff 2021-07-11)编译的 oxipng 5.0.0 与 OptiPNG 版本 0.7.7 进行比较。
Benchmark #1: ./target/release/oxipng -P ./tests/files/rgb_16_should_be_grayscale_8.png
Time (mean ± σ): 128.8 ms ± 14.2 ms [User: 296.0 ms, System: 14.3 ms]
Range (min … max): 98.8 ms … 152.3 ms 21 runs
Benchmark #2: optipng -simulate ./tests/files/rgb_16_should_be_grayscale_8.png
Time (mean ± σ): 254.2 ms ± 16.0 ms [User: 252.8 ms, System: 1.2 ms]
Range (min … max): 208.4 ms … 263.8 ms 14 runs
Summary
'./target/release/oxipng -P ./tests/files/rgb_16_should_be_grayscale_8.png' ran
1.97 ± 0.25 times faster than 'optipng -simulate ./tests/files/rgb_16_should_be_grayscale_8.png'
Benchmark #1: ./target/release/oxipng -o4 -P ./tests/files/rgb_16_should_be_grayscale_8.png
Time (mean ± σ): 141.4 ms ± 14.9 ms [User: 611.7 ms, System: 21.1 ms]
Range (min … max): 100.2 ms … 160.4 ms 23 runs
Benchmark #2: optipng -o 4 -simulate ./tests/files/rgb_16_should_be_grayscale_8.png
Time (mean ± σ): 730.0 ms ± 25.9 ms [User: 728.0 ms, System: 1.2 ms]
Range (min … max): 713.3 ms … 768.2 ms 10 runs
Summary
'./target/release/oxipng -o4 -P ./tests/files/rgb_16_should_be_grayscale_8.png' ran
5.16 ± 0.58 times faster than 'optipng -o 4 -simulate ./tests/files/rgb_16_should_be_grayscale_8.png'
依赖项
~4–14MB
~175K SLoC