自动化脚本批量转换图片WebP节省带宽
图片越多,网站带宽压力越大。
把图片批量转换成 WebP 格式,通常能在画质几乎不变的情况下减小 30%-70% 体积,从而显著节省带宽和存储成本。
本文面向零基础用户,直接用一套自动化脚本完成批量转换,并讲清楚如何配置、排错和验证结果,适合图片站、图床、商城网站或任何图片较多且带宽紧张的服务器场景。
WebP 为什么能省带宽
WebP 是 Google 推出的图片格式,同等画质下体积比 JPG、PNG 更小。
对网页来说,图片体积减小,用户加载页面的流量就少,服务器的出网带宽占用也跟着下降。
尤其当网站有大量商品图、文章配图或相册时,把图片转换为 WebP 往往是成本最低、见效最快的优化手段。
你不需要改图片显示位置,只要把文件格式换掉,再让网页指向新文件即可。
如果配合 Nginx 的 try_files 规则或前端 标签,还能实现「支持 WebP 的浏览器显示 WebP,不支持的就回落原格式」。
不过本文先解决最核心的批量转换问题。
第一步:准备环境并安装转换工具
操作前请确认你的服务器是 Linux 系统,最好有 root 或 sudo 权限。
网站面板(如宝塔)用户可以在终端中执行以下命令,不影响面板使用。
Debian/Ubuntu 系统执行:
sudo apt update
sudo apt install webp
CentOS/RHEL 系统执行:
sudo yum install libwebp-tools
装好后验证一下:
cwebp -version
如果能输出版本号,说明工具可用了。cwebp 就是负责把 JPG/PNG 转成 WebP 的命令行工具。
第二步:编写批量转换脚本
新建一个脚本文件,例如 /root/convert_webp.sh:
vim /root/convert_webp.sh
粘贴以下内容,注意把 SRC_DIR 换成你网站图片所在的真实目录:
#!/bin/bash
# 批量将 JPG/JPEG/PNG 转换为 WebP,已转换的文件自动跳过
SRC_DIR="/www/wwwroot/example.com/images"
QUALITY=80
find "$SRC_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | while read img; do
out="${img%.*}.webp"
if [ ! -f "$out" ]; then
cwebp -q "$QUALITY" "$img" -o "$out" && echo "已转换: $img"
fi
done
-q 80 表示质量 80,这是兼顾画质与体积的常用值。
保存后给脚本加执行权限:
chmod +x /root/convert_webp.sh
先手动跑一次看看效果:
bash /root/convert_webp.sh
正常会逐行显示“已转换: 图片路径”。
如果提示 cwebp: command not found,说明工具没装成功,回到第一步检查安装命令是否有报错。
第三步:设置定时任务,实现全自动转换
图片是不断新增的,手动跑不是长久之计。
用 crontab 定时执行脚本即可。
执行:
crontab -e
如果第一次使用,会提示选择编辑器,选 nano 或 vim 都行。
在文件末尾加一行:
0 * * * * /root/convert_webp.sh >/dev/null 2>&1
这行意思是在每小时的第 0 分钟自动执行一次转换脚本,错误信息不输出,避免日志刷屏。
保存后,定时任务就生效了。
如果你的服务器上已经部署了 CDN 或对象存储,还可以把脚本中的路径换成挂载目录,这样每次新增图片都会在源站自动生成 WebP 文件,CDN 回源时就能直接拿到新格式。
避坑要点:这几件事不注意容易出问题
别急着删原图。 转换完成后先确认 WebP 文件能正常访问,再把原图移动到备份目录,不要立即删除。
部分老旧浏览器或个别图片插件对 WebP 支持不好,原图留着可以做兜底。
检查图片路径是否一致。 脚本生成的新文件放在原图同目录,文件名相同、后缀是 .webp。
如果你的网站代码写死了 .jpg 后缀,需要手动改网页模板,或者用 Nginx rewrite 规则自动指向 WebP。
质量参数别盲目拉满。 很多人以为质量越高越好,其实 -q 90 以上体积降幅明显变小,画质也很难感知。
建议用 75-85,优先保证体积收益。
图片量大时分批跑。 几万张图片一次性转换会拉高 CPU 和磁盘 IO,可能导致网站响应变慢。
可以在脚本里加上 find 的 -mtime 参数只处理近期新增图片,或者一次只处理一个子目录。
WebP 显示空白? 先检查服务器 MIME 类型是否正确。
Nginx 环境下在站点配置中加入:
location ~*\.webp$ {
add_header Content-Type image/webp;
}
如果是 Apache,可以在 .htaccess 中添加 AddType image/webp .webp。
怎么验证带宽确实省了
转换完成后,用 ls -lh 对比同一张图片的 JPG 和 WebP 大小:
ls -lh /www/wwwroot/example.com/images/
通常 WebP 文件会比原图小一半以上。
想统计整个目录总体积变化,可以执行:
du -sh /www/wwwroot/example.com/images/
转换前后各记一次数字,差值就是节省下来的存储空间。
而带宽层面的效果,建议观察一周的服务器出网流量,或者 CDN 的流量报表。
如果图片请求量稳定,流量下降 20%-50% 都很正常。
另外,在浏览器开发者工具的 Network 面板里刷新页面,找到图片请求,也能直接看到传输大小。
配合浏览器插件开启“强制 WebP”后,还能对比两种格式的加载耗时。
如果你正在处理自动化脚本批量转换图片 WebP 节省带宽这件事,建议先按本文步骤完整执行,再根据自己的环境做微调。
遇到图片不显示、脚本报错或定时任务不执行时,优先回看上面的避坑部分,大部分问题都出在路径、权限或 MIME 配置上。
批量转换确实能让网站变轻,但前提是每步都验证到位。