The image about convert png to webp by ffmpeg

使用强大的多媒体处理工具 FFmpeg,通过简单的命令行操作将 PNG 格式的图片转换为高效的 WebP 格式。 WebP 格式通常可以提供比 PNG 更小的文件体积,同时保持相当的图像质量,这对于网页优化尤其重要。

基本转换命令

最基础的转换命令非常直接。您只需要指定输入文件和输出文件,FFmpeg 会自动处理格式的转换。

ffmpeg -i input.png output.webp

在这个命令中,将 input.png 替换为您要转换的 PNG 图片的文件名,并将 output.webp 替换为您希望生成的 WebP 图片的文件名。

控制输出质量(有损压缩)

当你不追求完全无损的转换时,可以通过调整质量参数来平衡图像质量和文件大小。这对于在网页上使用的图片非常有用, 可以在视觉效果可接受的前提下,显著减小文件体积。

主要有两个参数可以控制有损压缩的质量:

  • -quality:这个参数用于设定图像的质量,取值范围是 0 到 100,数值越高,图像质量越好,文件也越大。默认值是 75。
  • -compression_level:这个参数控制压缩的级别,取值范围是 0 到 6。 较高的值会花费更长的编码时间来换取更小的文件体积,而较低的值则编码速度更快。

示例:

ffmpeg -i input.png -quality 80 -compression_level 6 output.webp

这个命令会以 80% 的质量进行转换,并使用最高的压缩级别来尽可能地减小文件大小。

无损转换

如果您希望在转换过程中不损失任何图像信息,可以选择无损转换。这对于需要保留原始图像所有细节的场景(如图标或需要二次编辑的图片)非常重要。

要进行无损转换,您需要使用 -lossless 参数。

ffmpeg -i input.png -lossless 1 output.webp

在无损模式下,-quality 参数的含义会发生变化。它不再控制视觉质量,而是控制压缩算法的强度和花费的时间。 较高的 -quality 值(例如 100)会启用更复杂的压缩算法,从而可能得到更小的文件,但编码过程会更慢。

示例:

ffmpeg -i input.png -lossless 1 -quality 100 output.webp

这个命令会执行无损转换,并使用最高的压缩强度来优化文件大小。

批量转换

如果您有大量的 PNG 图片需要转换,可以结合使用循环语句来批量处理。

在 Linux 或 macOS 系统中:

您可以使用 for 循环来遍历当前目录下所有的 PNG 文件并进行转换。

for i in *.png; do ffmpeg -i "$i" "${i%.*}.webp"; done

在 Windows 系统中:

您可以在命令提示符 (CMD) 中使用类似的 for 循环。

for %i in (*.png) do ffmpeg -i "%i" "%~ni.webp"

这些批量转换的命令会自动将每个 PNG 文件转换为同名的 WebP 文件(例如,image1.png 会被转换为 image1.webp)。



”${i%.*}.webp 部分语法解释

这实际上是 Shell(比如 Bash)中的一种功能,称为参数扩展(Parameter Expansion)。它用于对变量的值进行处理和转换。

让我们把它分解来看:

1. ${...}

这部分是参数扩展的基础语法。它告诉 Shell,我们要对花括号内的变量进行某种操作,而不仅仅是简单地获取它的值。 在这个例子中,操作对象是变量 i。在 for i in *.png 这个循环里, 变量 i 会依次代表每个匹配到的 .png 文件名(例如 image1.pngphoto.png 等)。

2. i

这是变量的名称,也就是我们正在处理的文件名。

3. %

这是参数扩展中的一个操作符。它的作用是:从变量值的末尾开始,删除最短匹配到的 .* 部分

4. .*

这部分是一个 “通配符” 或 “模式 (pattern)”,它用来描述要删除的内容:

  • .:匹配一个实际的点(.)。
  • *:匹配点(.)后面的任意多个字符(也就是文件的扩展名)。

所以,%.* 的意思就是:找到最后一个点(.)以及它后面的所有字符,然后把它们都删掉。

5. .webp

这部分是在前面操作完成后,再拼接上去的普通字符串。


综合示例

假设循环正在处理一个名为 my-vacation-photo.png 的文件:

  1. 变量 i 的值是: my-vacation-photo.png
  2. 执行 ${i%.*}
    • Shell 会从字符串 my-vacation-photo.png 的末尾开始查找 .* 模式。
    • 它找到了 .png
    • % 操作符会删除这个最短的匹配部分。
    • 执行后,结果是 my-vacation-photo
  3. 拼接 .webp
    • my-vacation-photo 的末尾加上 .webp
    • 最终得到的结果是:my-vacation-photo.webp

因此,在 ffmpeg -i "$i" "${i%.*}.webp" 这个命令中,${i%.*}.webp 的作用就是, 在保留原始文件名的基础上(不包括扩展名),将文件的扩展名替换为 .webp,从而生成一个新的输出文件名。 这是一种在命令行中进行文件名批量处理的非常高效和简洁的方法。