使用cwebp批量将 JPG 和 PNG 转换为 WebP 图片格式
我并不过分关注搜索引擎优化或博客的性能,但却认为没有必要让别人下载 350k 的图片——因为 17k 的图片就可以了。为了做到这一点,我将所有图片从以前的 png 和 jpg 格式转换为谷歌的 WebP 格式。我一直使用 cwebp 命令行工具来完成这项工作。
我的目标是:
- 将所有 jpg 和 png 文件转换为 webp 文件
- 调整所有这些文件的尺寸为最大宽度为 800(保持长宽比)
- 整个目录结构批量执行 #1 步和 #2 步
转换单个文件
使用 cwebp 将单个文件转换为 webp 非常简单:
cwebp infile.png -o outfile.webp
使用默认设置(品质75)将 png 文件转换为 webp 文件。
cwebp -resize 800 0 infile.webp
这将 webp 文件的最大宽度调整为 800,0 表示 “保持高度的宽高比”。
你可以把这两者放在一起,就像
cwebp -resize 800 0 infile.png -o outfile.webp
批量转换整个目录下的图片
现在我们可以转换单个文件了,我使用 find 和 bash 或 zsh 的组合来完成我对目录的需求。本例将一个目录结构中的所有 png 文件转换为 webp 文件,并将它们调整为 800px 宽,同时保持原来的宽高比:
Using bash shell:
for x in $(find . -iname '*.png');do cwebp -resize 800 0 "${x}" -o "${x%%png}"webp;done
Using Z shell:
unsetopt CASE_GLOB && for x in ./**/*png;do cwebp -resize 800 0 "${x}" -o "${x/(png|PNG)/webp}";done; setopt CASE_GLOB
运行后,目录树中的每个 png 文件都将在同一位置有一个对应的 webp 文件,该 webp 文件的最大宽度将调整为 800px。
我认为输出结果效果不言自明。下面是输入图像的示例:
下面是经过压缩和调整大小的 WebP 版本
原始文件为 338K,webp 版本为 16K 字节–大约节省了 95%,但整体视觉体验变化不大(个人博客标准)。
cwebp命令行参数说明
摘要
cwebp [options] input_file -o output_file.webp
说明
cwebp
使用 WebP 格式压缩图片。输入格式可以是 PNG、JPEG、TIFF、WebP 或原始 Y’CbCr 样本。注意:不支持 PNG 和 WebP 动画文件。
选项
基本选项包括:
-o string
- 指定 WebP 输出文件的名称。如果省略,
cwebp
将执行压缩,但仅报告统计信息。使用“-”作为输出名称会将输出定向到“stdout”。 -- string
- 明确指定输入文件。例如,如果输入文件以“-”开头,则此选项非常有用。此选项必须显示为
last
。之后的所有其他选项都将被忽略。 -h, -help
- 简短的使用情况摘要。
-H, -longhelp
- 所有可能选项的摘要。
-version
- 输出版本号(作为 main.minor.revision)并退出。
-lossless
- 在不丢失数据的情况下对图像进行编码。对于具有完全透明区域的图片,只有在使用
-exact
选项时,系统才会保留不可见的像素值(R/G/B 或 Y/U/V)。 -near_lossless int
- 指定近无损图像预处理的级别。此选项会调整像素值以帮助可压缩,但对视觉质量的影响微乎其微。它会自动触发无损压缩模式。 范围是
0
(最大预处理)到100
(无预处理,默认值)。典型值约为60
。请注意,使用-q 100
有损有时可以产生更好的结果。 -q float
- 指定
0
和100
之间的 RGB 通道压缩系数。默认值为75
。如果是有损压缩(默认),则较小因素会生成较小但质量较低的文件。使用
100
值可实现最佳质量。对于无损压缩(由
-lossless
选项指定),较小因素可实现更快的压缩速度,但生成的文件会更大。使用100
值可实现最大压缩。 -z int
- 开启
lossless
压缩模式,指定级别介于 0 到 9 之间,级别 0 表示最快,级别 9 表示最慢。与速度较慢的模式相比,快速模式会生成更大的文件。建议使用-z 6
。此选项实际上是某些质量和方法预定义设置的快捷方式。如果随后使用了选项-q
或-m
,这些选项将使此选项的效果失效。 -alpha_q int
- 在
0
和100
之间指定 Alpha 压缩的压缩因数。alpha 的无损压缩是使用100
值实现的,而较低的值则会实现有损压缩。默认值为100
。 -preset string
- 指定一组适合特定类型的源材料的预定义参数。可能的值包括:
default
、photo
、picture
、drawing
、icon
、text
。由于
-preset
会覆盖其他参数的值(-q
除外),因此此选项最好按照实参的顺序显示在最前面。 -m int
- 指定要使用的压缩方法。此参数用于控制编码速度与压缩文件大小和质量之间的权衡。可能的值介于
0
到6
之间。默认值为4
。 使用更高的值时,编码器将花费更多时间来检查其他编码可能性并确定质量增益。较低的值可以加快处理时间,但会占用较大的文件大小和较低的压缩质量。 -crop x_position y_position width height
- 将源头剪裁为一个左上角坐标为(
x_position
、y_position
)的矩形,尺寸为width
xheight
。此剪裁区域必须完全包含在源矩形内。注意:剪裁会在任何缩放之前应用。 -resize width height
- 将来源图片调整为一个大小为
width
xheight
的矩形。如果宽度参数或高度参数中有一个(但不是两个参数都为0
),在计算该值时将保持宽高比不变。注意:缩放是在剪裁后应用。 -mt
- 如果可能,请使用多线程进行编码。
-low_memory
- 通过将有损编码节省四倍(通常),减少有损编码的内存用量。这会减慢编码速度,并使输出在大小和失真方面略有不同。此标志仅对方法 3 及更高版本有效,并且默认关闭。请注意,关闭此标记会对比特流产生一些负面影响:它会强制某些比特流功能,例如分区数(强制设为
1
)。请注意,使用此选项时,cwebp
会输出更详细的比特流大小报告。
有损选项
这些选项仅在执行有损编码(默认,无论有无 alpha 和)时有效。
-size int
- 指定压缩输出要尝试达到的目标大小(以字节为单位)。压缩器将进行多次部分编码传递,以尽可能接近此目标。如果同时使用
-size
和-psnr
,则以-size
值为准。 -psnr float
- 指定压缩输出要尝试达到的目标 PSNR(以 dB 为单位)。 压缩器将进行多次部分编码传递,以尽可能接近此目标。如果同时使用
-size
和-psnr
,则以-size
值为准。 -pass int
- 设置选项
-size
或-psnr
所用二元法期间要使用的卡券数量上限。最大值为10
,默认值为1
。如果使用了-size
或-psnr
选项,但未指定-pass
,则系统将使用默认值“6”次。 -af
- 开启自动过滤功能。此算法将花费额外的时间来优化过滤强度,以达到平衡的质量。
-jpeg_like
- 更改了内部参数映射,以更好地符合 JPEG 压缩的预期大小。此标记通常会生成与其等效 JPEG 大小的输出文件(针对相同的
-q
设置),但视觉失真更小。
高级选项:
-f int
- 指定去块效应滤波器的强度,介于
0
(无滤波)和100
(最大滤波)之间。值为0
表示关闭所有过滤。值越高,解码图片后应用的过滤流程的强度就越大。值越高,显示效果越平滑。典型值通常介于20
到50
之间。 -sharpness int
- 指定滤镜的锐度(如果使用)。范围为
0
(最锐)到7
(最不锐)。默认值为0
。 -strong
- 使用强过滤(如果通过
-f
选项使用过滤)。系统会默认启用强过滤功能。 -nostrong
- 停用强过滤(如果通过
-f
选项使用过滤),并改用简单过滤。 -sharp_yuv
- 根据需要使用更准确、更清晰的 RGB->YUV 转换。请注意,此过程比默认的“快速”RGB->YUV 转换慢。
-sns int
- 指定空间噪声形状的振幅。空间噪声形状(简称 sns)是指内置算法的常规集合,用于确定照片的哪个区域应使用相对较少的位,以及在哪里可以更好地传输这些位。可能的范围从
0
(算法关闭)到100
(最大效果)。默认值为50
。 -segments int
- 更改在 SNS 算法分段期间要使用的分区数。细分应介于
1
到4
之间。默认值为4
。 除非使用-low_memory
,否则此选项对方法 3 及更高版本没有影响。 -partition_limit int
- 通过限制某些宏块使用的位数来降低质量。 范围为
0
(默认值)到100
(完全降级)。 对于中等大小的图片,比较有用的值通常在30
–70
左右。在 VP8 格式中,所谓的控制分区上限为 512k,用于存储以下信息:是否跳过宏块、宏块属于哪个区段、编码为 4×4 内还是 16×16 模式,最后是用于每个子块的预测模式。对于非常大的图片,512k 只为每个 16×16 宏块留出了几个位。绝对最小值是每个宏块 4 位。跳过、片段和模式信息几乎会占用这 4 位(尽管这种情况不太可能发生),这对于非常大的图片会出现问题。partition_limit
系数用于控制使用费用最高的模式(4×4 内)的频率。在达到 512k 限制且显示以下消息时,此操作非常有用:错误代码:6(PARTITION0_OVERFLOW:分区 #0 太大,无法容纳 512k)。如果使用-partition_limit
不足以满足 512k 约束条件,则应使用较少的片段,以便每个宏块节省更多标头位。请参阅-segments
选项。
日志记录选项
这些选项可控制输出的级别:
-v
- 输出额外信息(特别是编码时间)。
-print_psnr
- 计算并报告平均 PSNR(峰值信噪比)。
-print_ssim
- 计算并报告平均 SSIM(结构相似性指标,请参阅 https://en.wikipedia.org/wiki/SSIM 了解更多详情)。
-print_lsim
- 计算并报告局部相似度指标(并置像素相邻像素中最小误差之和)。
-progress
- 报告编码进度(以百分比表示)。
-quiet
- 不输出任何内容。
-short
- 仅出于测试目的输出简要信息(输出文件大小和 PSNR)。
-map int
- 输出其他编码信息的 ASCII 映射。可能的映射值范围从
1
到6
。这仅用于帮助调试。
其他选项
更多高级选项包括:
-s width height
- 指定输入文件实际包含遵循 ITU-R BT.601 建议且采用 4:2:0 线性格式的原始 Y’CbCr 样本。亮度平面的大小为
width
xheight
。 -pre int
- 指定一些预处理步骤。使用
2
值会在 RGBA->YUVA 转换期间触发依赖于质量的伪随机抖动(仅限有损压缩)。 -alpha_filter string
- 为 alpha 平面指定预测性过滤方法。
none
、fast
或best
之一,按增加的复杂性和运行速度缓慢的顺序排列。默认值为fast
。在内部,alpha 过滤使用四种可能的预测(无、水平、垂直、渐变)执行。best
模式会依次尝试每种模式,然后选择具有较小大小的模式。fast
模式只会尝试形成先验猜测,而不测试所有模式。 -alpha_method int
- 指定用于 Alpha 压缩的算法:
0
或1
。算法0
表示不压缩,1
使用 WebP 无损格式进行压缩。默认值为1
。 -exact
- 保留透明区域中的 RGB 值。为提高可压缩性,默认为关闭。
-blend_alpha int
- 此选项会使用以十六进制形式指定为 0xrrggbb 的背景颜色,将 Alpha 通道(如果存在)与源颜色混合。之后,alpha 通道将重置为不透明值
255
。 -noalpha
- 如果使用此选项,系统将会舍弃 Alpha 渠道。
-hint string
- 指定关于输入图片类型的提示。可能的值包括
photo
、picture
或graph
。 -metadata string
- 要从输入复制到输出(如果存在)的元数据列表(以英文逗号分隔)。有效值:
all
、none
、exif
、icc
、xmp
。默认值为none
。请注意,每种输入格式可能不支持所有组合。
-noasm
- 停用所有汇编优化。
示例
cwebp -q 50 -lossless picture.png -o picture_lossless.webp
cwebp -q 70 picture_with_alpha.png -o picture_with_alpha.webp
cwebp -sns 70 -f 50 -size 60000 picture.png -o picture.webp
cwebp -o picture.webp -- ---picture.png
作者
cwebp
属于 libwebp
,由 WebP 团队编写。如需了解最新源代码树,请访问 https://chromium.googlesource.com/webm/libwebp/