图片WebP批量转换脚本降低带宽占用
为什么要用WebP批量转换脚本
网站图片体积过大是带宽占用高的主要原因之一。
WebP格式相比JPEG/PNG能压缩30%-80%的文件大小,且不影响显示质量。
手动一张张转换效率太低,批量转换脚本可以一次性处理整个文件夹的图片,既省时间又降低服务器压力。
脚本运行前需要准备这些
- 一台Linux服务器(本文以CentOS 7+ / Ubuntu 20.04+为例)
- 安装cwebp工具(Google官方WebP编码器)
- 存放原图的目标文件夹(建议提前备份)
安装cwebp命令(根据系统选一条执行):
# CentOS / Rocky Linux
yum install -y libwebp-tools
# Ubuntu / Debian
apt-get install -y webp
安装后执行 cwebp -version 确认正常显示版本号。
一键批量转换脚本的完整代码与使用说明
以下脚本会遍历 /data/images/ 下的所有 .jpg 和 .png 文件,在同目录生成同名 .webp 文件,并保留原图(可选)。
创建脚本文件:
nano /opt/batch2webp.sh
粘贴以下内容:
#!/bin/bash
# 图片WebP批量转换脚本 - 降低带宽占用
# 使用方法:bash /opt/batch2webp.sh
INPUT_DIR="/data/images"
QUALITY=80 # 质量参数,80通常平衡体积与画质
for file in "$INPUT_DIR"/*.{jpg,png,JPG,PNG}; do
if [ -f "$file" ]; then
filename=$(basename "$file")
name="${filename%.*}"
output="${INPUT_DIR}/${name}.webp"
echo "转换中:$file"
cwebp -q $QUALITY "$file" -o "$output"
fi
done
echo "批量转换完成!"
保存退出(Ctrl+X,Y,回车)。
给脚本执行权限:
chmod +x /opt/batch2webp.sh
运行脚本:
bash /opt/batch2webp.sh
脚本会自动跳过不存在的文件,并在控制台打印进度。
转换成功后,会在同目录看到 .webp 文件。
新手最容易踩的四个坑
1. 权限不足导致脚本无法执行
运行前请确保脚本有执行权限,且输入目录可读。如果遇到 Permission denied,先检查 chmod 是否正确。
2. 原图路径包含空格
上述脚本没有处理文件名含空格的情况。如果文件名有空格,建议先用 rename 命令将空格替换为下划线,或者修改脚本使用 find 配合 while read。简单方案:先批量重命名。
find /data/images -name "*.jpg" -o -name "*.png" | while read f; do mv "$f" "$(echo $f | tr ' ' '_')"; done
3. 转换后图片无法显示在网站上
需要确认网站是否支持WebP。如果使用Nginx,可添加 location ~* \.(webp)$ { add_header Content-Type image/webp; }。如果浏览器不支持(如老版Safari),建议保留原图并通过 标签兜底。
4. 批量转换后服务器负载过高
如果图片数量很大(上千张),建议分批次运行,或加上 nice -n 19 降低优先级:
nice -n 19 bash /opt/batch2webp.sh
如何验证转换效果和带宽节省情况
- 体积对比:查看原图和WebP文件大小,例如:
ls -lh /data/images/*.jpg /data/images/*.webp | awk '{print $5, $9}'
WebP体积通常只有原图的30%-70%。
- 浏览器检查:按F12打开开发者工具 → Network(网络)选项卡,刷新页面,查看图片的
Content-Type是否为image/webp。 - 带宽占用测量:如果你有服务器流量统计(如iftop、vnstat),在访问高峰前后对比流量。或者直接看CDN/云厂商的流量报表,通常会下降明显。
常见问题解答
Q:脚本转换后原图还在,会不会占用双倍空间?
是的。脚本只生成WebP,不删除原图。如果确认所有客户端都支持WebP,可以手动删除原图,或修改脚本在转换成功后加上 rm -f "$file"。但建议做好备份后再删除。
Q:质量参数设置多少合适?
一般场景 -q 80 效果很好。如果对体积要求极高,可降为 -q 60;对画质敏感,可升到 -q 90。可以先对一张图片测试不同参数。
Q:我想保留原目录结构,把转换后的WebP放到另一个目录怎么做?
只需修改脚本中的 OUTPUT_DIR 变量,并用 mkdir -p 创建输出目录。例如:
OUTPUT_DIR="/data/webp_images"
mkdir -p "$OUTPUT_DIR"
output="${OUTPUT_DIR}/${name}.webp"
如果你正在处理图片较多的网站,建议先按本文步骤完整运行一次,看看体积下降比例,再决定是否全站切换。
遇到异常时,优先回顾避坑部分,大部分问题都能在文中找到答案。