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 压缩

Download history 3906/week @ 2024-05-04 3464/week @ 2024-05-11 3565/week @ 2024-05-18 3235/week @ 2024-05-25 3450/week @ 2024-06-01 3177/week @ 2024-06-08 3499/week @ 2024-06-15 3282/week @ 2024-06-22 3316/week @ 2024-06-29 3349/week @ 2024-07-06 4040/week @ 2024-07-13 4055/week @ 2024-07-20 5320/week @ 2024-07-27 4380/week @ 2024-08-03 4461/week @ 2024-08-10 3980/week @ 2024-08-17

18,955 每月下载量
用于 31 个包 (17 直接使用)

MIT 许可

195KB
4.5K SLoC

Oxipng

Build Status Version License Docs

概述

Oxipng 是一个多线程的无损 PNG/APNG 压缩优化器。它可以通过命令行界面或作为其他 Rust 程序中的库来使用。

安装

Windows 版的 Oxipng 可以从 GitHub 页面的 发布 链接下载。

对于 MacOS 或 Linux,如果可能的话,建议从您的发行版软件仓库中安装。Oxipng 已知为以下环境打包。

Packaging status

或者,可以使用以下命令通过 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