#gif #调色板 #量化 #pngquant #压缩 #像素

imagequant

将24/32位图像转换为带有alpha通道的8位调色板。对于有损PNG压缩和高品质GIF图像,双授权如pngquant。有关详细信息,请参阅https://pngquant.org。

16个稳定版本

4.3.3 2024年8月5日
4.3.1 2024年4月27日
4.3.0 2024年1月22日
4.2.2 2023年10月13日
2.3.3 2015年3月2日

图像类别的第14

Download history 1632/week @ 2024-05-04 1761/week @ 2024-05-11 1827/week @ 2024-05-18 1714/week @ 2024-05-25 1926/week @ 2024-06-01 2328/week @ 2024-06-08 2161/week @ 2024-06-15 1860/week @ 2024-06-22 2017/week @ 2024-06-29 1789/week @ 2024-07-06 2132/week @ 2024-07-13 2238/week @ 2024-07-20 3002/week @ 2024-07-27 3017/week @ 2024-08-03 2883/week @ 2024-08-10 2043/week @ 2024-08-17

每月下载量11,261
23个crate(14个直接使用)中使用

GPL-3.0-or-later

170KB
3.5K SLoC

libimagequant — 图像量化库

Imagequant库将RGBA图像转换为基于调色板的8位索引图像,包括alpha组件。它非常适合生成小型PNG图像和美观的GIF

库本身不处理图像编码/解码,请使用自己的编码器。如果您正在寻找命令行工具,请参阅pngquant

C语言入门

此库可以通过imagequant-sys Rust包在C程序中使用。

rustup update
git clone https://github.com/ImageOptim/libimagequant
cd imagequant-sys
cargo build --release
# makes target/release/libimagequant_sys.a

有关更多详细信息,请参阅C库文档

Rust语言入门

添加到Cargo.toml

rustup update
cargo add imagequant

请参阅docs.rs以获取库API文档.

许可证

Libimagequant双授权

  • 对于免费/开源软件,它可在GPL v3或更高版本下使用,并附加了版权声明,原因在于历史原因。
  • 对于用于闭源软件、AppStore分发和其他非GPL用途,您可以获取商业许可证。如果您需要,请随时[email protected]询问详细信息以及定制授权条款。

升级说明

libimagequant v2曾经是一个C库。libimagequant v4完全用Rust编写,但仍为C程序导出相同的C接口。您需要安装Rust 1.70+来构建它,并调整您的构建命令。如果您不想升级,您可以在仓库的2.x分支中使用库的C版本。

C静态库用户

C/C++ 的文件现在位于 imagequant-sys/ 子目录中,而不是仓库的根目录。现在不再有 configure && make 命令了。

要构建库,请通过 rustup 安装 Rust,然后运行

rustup update
cd imagequant-sys
cargo build --release

它将生成 target/release/libimagequant_sys.a 静态库。API、ABI 和头文件保持不变,因此其他一切应该工作正常。如果你正在为 macOS 或 iOS 构建,请查看包含的 xcodeproj 文件(将其添加为 子项目)。

如果你正在为 Android 构建,请运行 rustup target add aarch64-linux-android; cargo build --release --target aarch64-linux-android 并使用 target/aarch64-linux-android/release/libimagequant_sys.a。对于跨编译到其他平台也是一样。请参阅 rustup target list

为软件包维护者提供的 C 动态库

如果你是应用程序开发者,请使用上面的静态链接选项——该选项更容易使用,并生成更小的可执行文件。

该库的 API 和 ABI 保持不变。它具有相同的 sover,因此它可以作为先前 C 版本的直接替换。

该库现在是典型的 Rust/Cargo 库。如果你想设置 离线构建覆盖依赖项,它与每个其他 Rust 项目的工作方式相同。请参阅 Cargo 文档,例如 cargo fetchcargo vendor(但我不建议使用 vendoring)。

如果你想构建动态库,但不介意 soname 和 rpath 出错,请修改 imagequant-sys/Cargo.toml 并将 "cdylib" 添加到现有的 crate-type 属性中,然后 cargo build --release 将执行它通常的半成品工作并构建 target/release/libimagequant.{so,dylib,dll}

使用 make 构建

configure && make 命令已消失。我希望我只需将静态库包装起来就可以构建动态库,但显然不行,因此我无法轻松地重新创建旧的 make install。我希望有一个比使用 cargo-c 工具更标准、更轻量级的解决方案,所以如果你擅长处理链接器标志和符号可见性,请发送拉取请求。

使用 cargo-c 构建

工具 cargo-c 知道如何正确构建和链接 so/dylib,并生成准确的 pkg-config 文件,因此对于系统范围内正确安装动态库实际上是必需的。

rustup update
cd imagequant-sys
cargo install cargo-c
cargo cinstall --prefix=/usr/local --destdir=.

这使得 Rust 1.70 和 cargo-c 包成为构建时的依赖项。没有运行时依赖(除了 Cargo 内部的依赖)。OpenMP 已经完全删除。

与 pngquant 的交互

pngquant v2 可以将此库作为动态库使用。然而,pngquant v4 不支持解包。它通过其 Rust 原生接口将其作为 Cargo 依赖项使用。共享 libimagequant 库仅导出 C 程序的稳定 ABI,而这个接口对于 Rust 程序来说没有用。

为 Rust 用户升级

如果您使用过 imagequant-sys 包,请切换到更高级的 imagequant 包。imagequant v4 几乎完全向后兼容,只有一些小的更改(例如,将 c_int 的使用更改为 u32),Rust 编译器会指出这些更改。请参阅 文档。请修复您可能收到的任何弃用警告,因为弃用的函数将被删除。

openmp Cargo 功能已重命名为 threads

.new_image() 现在可以对其参数拥有所有权,以避免复制。如果您遇到错误,表明 From<&Vec<RGBA>> 未实现,则要么不要通过引用传递(移动、避免复制),要么在该参数上调用 .as_slice()(以复制像素),或者使用 .new_image_borrowed() 方法。

线程支持与 WASM

默认情况下,当启用 threads Cargo 功能时,此库使用多线程。可以通过 RAYON_NUM_THREADS 环境变量控制线程数量。

WASM 中的线程是实验性的,并且需要 特殊处理。如果您针对 WASM,您可能想要禁用线程。

要使用此库作为依赖项时禁用线程,请在 Cargo.toml 中禁用默认功能,如下所示

[dependencies]
imagequant = { version = "4.0", default-features = false }

当您直接编译库时,请添加 --no-default-features 标志。

依赖项

~350–670KB
~12K SLoC