将 JPEG 和 PNG 批量转换为 WebP

总结

目前我正在重新整理我的笔记和博客,其中涉及的任务之一是将所有现有图像(JPEGPNG)批量转换为 WebP

为了做到这一点,需要将 findxargscwebp 串联在一起使用。

为了节省您一些时间,以下是我使用的命令:

1
2
3
4
5
# Convert PNGs
find . -iname "*.png" -print0 | xargs -0 -n 1 -P 0 -I '{}' cwebp '{}' -short -q 90 -alpha_q 100 -m 6 -o '{}'.webp

# Convert JPGs
find . \( -iname "*.jpg" -o -iname "*.jpeg" \) -print0 | xargs -0 -n 1 -P 0 -I '{}' cwebp -short -q 80 '{}' -o '{}'.webp

简单来说,这几条命令就是将当前目录下的所有图片文件递归地转换为 webp

find * 开始,将结果通过管道传输到 xargs *,在调用 cwebp 进行转换。

如果您感兴趣,请往下看看命令是如何组成的。

寻找 find

1
find . -iname "*.png" -print0

. 表示在当前目录中开始搜索

-iname 表示只搜索特定格式的图片

-print0 表示用空字符终止每个文件名,方便后续使用

1
find . -iname "*.jpg" -iname "*.jpeg" -o -print0

上面命令返回了以 .jpg.jpeg 结尾的文件,为此使用了两个 -iname 选项,在多选项中,记得添加 -o,这里是代表 or 的意思。

xargs 命令

xargs 是一个强大的命令行工具,它可以从标准输入(stdin)读取数据,并将这些数据转换为特定命令的参数列表。

这是完整的 xargs 命令:

1
xargs -0 -n 1 -P 0 -I '{}' cwebp '{}' -short -q 90 -alpha_q 100 -m 6 -o '{}'.webp

需要理解上面这一条语句,首先先看看这个例子:

1
xargs -0 -n 1 -P 0 -I '{}' echo '{}'

-0 表示输入以空字符结束(这与 find-print0 选项一起使用)

-n 1 -P 0 告诉 xargs 尽可能多的使用进程

-I '{}' 此选项命名输入,启用后就可以执行后面的操作

echo '{}' 这是 xargs 为每个提供的输入运行的命令

cwebp

JPEG 转 WebP

1
cwebp -short -q 80 '{}' -o '{}'.webp

使用这个命令将 Jpeg 转换为 WebPs

-short 打印简短的摘要(可以使用静默模式 -quiet 代替)

-q 指定质量,100 为最高

'{}' 这是 find 提供的输入

-o '{}'.webp 输出文件名

PNG 转 WebP

1
cwebp '{}' -short -q 90 -alpha_q 100 -m 6 -o '{}'.webp

这与上面的 cwebp 命令几乎完全相同。除了:

-alpha_q 100Alpha 透明度通道设置为 100

-m 6 将图片压缩增加到 6(默认为 4