ImageMagick 如何将选项传递给 cwebp Linux

How does ImageMagick pass options to cwebp Linux

我运行宁

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 9 (stretch)"
NAME="Debian GNU/Linux"
VERSION_ID="9"
VERSION="9 (stretch)"
ID=debian

我也在运行宁 ImageMagick 6.9.

我想将 PDF 图像转换为 WebP。 AFAIK,开箱即用,Linux 上的 ImageMagick 无法转换为 WebP,所以我 sudo apt-get install webp 安装了 cwebp.

cwebp允许指定-q参数,ImageMagick允许指定-quality参数。

当我 运行 $ cwebp -q 90 image.png -o image.webp 时,转换它需要 cwebp 大约 8 秒。如果我 运行 convert image.png -quality 90 image.webp,ImageMagick 需要大约 30 秒来转换它。 -quality 参数似乎没有传递给 cwebp。也可能是 convert 尝试 运行 无损转换,在 cwebp 中是通过显式 -lossless 标志实现的。

我 运行 10 MB 测试 png 图像的测试命令。

我想用 convert 命令实现 8 秒的转换时间。我该怎么做?

事实证明,委托是使用 /etc/ImageMagick-6/delegates.xml 中的规则调用的。

它列出了一堆关于如何在不同类型的图像之间进行转换的规则。

对于我的情况,png->webp 转换,我需要字符串: <delegate decode="png" encode="webp" command="&quot;cwebp&quot; -quiet %Q &quot;%i&quot; -o &quot;%o&quot;"/>

虽然在这个文件中我不知道 -quaility 参数值,而且似乎没有办法捕获它。

但是,如果您希望为 cwebp 保留 -q 参数的值,您可以选择将 -q $YOUR_VALUE 硬编码到 commanddelegate 标签内。

此解决方案仍然比直接调用 cwebp 慢,因为 ImageMagick 在调用委托之前最多可能需要 8 秒。

我知道你想要 imagemagick,但如果你能考虑替代方案,libvips 可以在命令行快速执行 pdf -> webp,无需任何配置。

例如,在我 2015 年的笔记本电脑上使用 this PDF (Audi R8 brochure),我看到:

$ time convert -density 600 r8.pdf[3] -quality 90 x.webp
real    0m36.699s
user    0m23.787s
sys 0m1.628s
$ vipsheader x.webp
x.webp: 9921x4961 uchar, 3 bands, srgb, webpload

我认为这与您所看到的时代大体一致。

使用 libvips,我看到:

$ time vips copy r8.pdf[dpi=600,page=3] x.webp[Q=90]
real    0m7.195s
user    0m6.861s
sys 0m0.505s
$ vipsheader x.webp
x.webp: 9921x4961 uchar, 3 bands, srgb, webpload

相同的结果,但在您 8 秒的时间预算内。

如果您想更好地控制压缩,可以设置 a lot of other webp options