如何用脚本批量处理图片?完整指南与实战技巧
📖 目录导读
- 为什么需要脚本批量处理图片? —— 场景与痛点分析
- 核心工具与技术选型 —— Python、ImageMagick、Photoshop脚本、Shell
- Python + Pillow:最通用的批量处理方案 —— 代码实战(缩放、格式转换、加水印)
- ImageMagick:命令行下的图片处理利器 —— 一句话完成批量操作
- JavaScript + Node.js:前端开发者的轻量选择 —— sharp库处理
- 常见批量任务问答 —— 批量重命名、压缩、裁剪、去水印
- SEO优化与注意事项 —— 图片ALT、文件名、体积、CDN适配
为什么需要脚本批量处理图片?
在日常运营、设计、开发或电商工作中,我们常面临以下场景:

- 上传商品图:800张商品图需要统一缩放到500×500像素,并添加水印。
- 网站性能优化:2000张博客配图需要从PNG转为WebP,且压缩至80KB以内。
- 社交媒体排版:每周500张图片需要批量打上日期、标题、Logo。
- 数据抓取与爬虫:从网站下载的图片需要重命名、去重、裁剪。
手动操作痛点:耗时、重复、易出错,使用脚本批量处理,可将80%的手动操作压缩为一次运行,效率提升10-100倍。
核心工具与技术选型
| 工具 | 语言/环境 | 适合场景 | 学习成本 |
|---|---|---|---|
| Python + Pillow | 跨平台 | 格式转换、缩放、水印、滤镜 | 低(上手快、生态好) |
| ImageMagick | 命令行 | 批量压缩、拼图、PDF生成 | 中(参数多、功能极强) |
| sharp (Node.js) | JavaScript | 高并发、Web端处理、内存优化 | 低(异步非阻塞) |
| Photoshop脚本 | Windows/Mac | PS内自动化动作、JSX脚本 | 中(依赖PS环境) |
Python + Pillow:最通用的批量处理方案
✅ 安装与基础代码
pip install pillow
批量缩放并保存为WebP(附带水印)
import os
from PIL import Image, ImageDraw, ImageFont
input_dir = "./images"
output_dir = "./processed"
watermark_text = "©example.com" # 请改为你的文本
os.makedirs(output_dir, exist_ok=True)
for filename in os.listdir(input_dir):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp')):
img_path = os.path.join(input_dir, filename)
img = Image.open(img_path).convert("RGB")
# 缩放为宽度400像素(高度等比)
ratio = 400 / img.width
new_size = (400, int(img.height * ratio))
img_resized = img.resize(new_size, Image.Resampling.LANCZOS)
# 添加水印
draw = ImageDraw.Draw(img_resized)
try:
font = ImageFont.truetype("arial.ttf", 24)
except:
font = ImageFont.load_default()
text_width, text_height = draw.textsize(watermark_text, font=font)
position = (img_resized.width - text_width - 15, img_resized.height - text_height - 15)
draw.text(position, watermark_text, fill=(255,255,255,180), font=font)
# 保存为WebP格式,质量80
out_path = os.path.join(output_dir, f"{os.path.splitext(filename)[0]}.webp")
img_resized.save(out_path, "WEBP", quality=80)
print(f"已处理: {filename} -> {out_path}")
核心参数说明
Image.Resampling.LANCZOS:高性能缩放算法(视觉效果最佳)。quality=80:WebP格式通用的质量/体积平衡值。convert("RGB"):移除Alpha通道,兼容JPEG保存。
ImageMagick:命令行下的图片处理利器
安装
# macOS brew install imagemagick # Ubuntu sudo apt install imagemagick
一句话完成批量操作
批量转换为WebP(所有JPG -> WebP,质量70%):
mogrify -format webp -quality 70 *.jpg
批量缩放并添加边框:
mogrify -resize 800x800 -border 5 -bordercolor "#ccc" -path ./output *.png
批量从PDF提取第一页为JPG:
for f in *.pdf; do convert "$f[0]" -resize 1200 "output/${f%.pdf}.jpg"; done
✅ 优势:无需编程环境,支持200+格式,适合一次性快速处理。
⚠️ 注意:mogrify会直接覆盖原文件,记得先用-path参数指定输出目录。
JavaScript + Node.js:前端开发者的轻量选择
安装 sharp
npm install sharp
批量压缩并重命名(支持PNG/JPG/WebP)
const sharp = require('sharp');
const fs = require('fs');
const path = require('path');
const inputDir = './input';
const outputDir = './output';
const targetWidth = 800;
fs.readdirSync(inputDir).forEach(file => {
const ext = path.extname(file).toLowerCase();
if (['.png','.jpg','.jpeg','.webp'].includes(ext)) {
sharp(path.join(inputDir, file))
.resize(targetWidth)
.jpeg({ quality: 80, progressive: true })
.toFile(path.join(outputDir, `opt_${file}`))
.then(info => console.log(`${file} -> ${info.width}x${info.height}`));
}
});
💡 适用场景
- Node.js后端:结合Express作为图片上传处理中间件。
- 浏览器自动化:使用puppeteer截图后批量优化。
常见批量任务问答
❓ Q1:如何批量重命名图片为自然数序号(如001.jpg、002.jpg)?
A:使用Python或Shell脚本:
# Bash方式(适用于Linux/macOS) i=1; for f in *.jpg; do mv "$f" $(printf "%03d.jpg" $i); i=$((i+1)); done
# Python方式,保证顺序按文件名排序
import os
files = sorted([f for f in os.listdir('.') if f.endswith('.jpg')])
for idx, f in enumerate(files, start=1):
os.rename(f, f"{idx:03d}.jpg")
❓ Q2:如何用脚本自动检测并删除重复图片?
A:使用ImageMagick的compare命令或Python计算感知哈希(phash)。
# 简单思路:计算MD5并去重
import hashlib
hash_map = {}
for f in os.listdir('.'):
with open(f, 'rb') as fp:
md5 = hashlib.md5(fp.read()).hexdigest()
if md5 in hash_map:
os.remove(f) # 删除重复
else:
hash_map[md5] = f
❓ Q3:批量给图片加文字水印如何避免遮挡主要内容?
A:采用边缘定位+半透明+小字号。 建议:
- 右下角距离边距10-20像素
- 文字透明度100-180(0透明,255不透明)
- 字体对比如白底黑字/黑底白字
❓ Q4:如何处理超大图(如5000万像素)的内存溢出?
A:使用pystream或sharp的流式处理。
- 调整时设置
resize并打开sharpen - 或使用
ImageMagick的-resize配合-quality参数
SEO优化与注意事项
处理后的图片若用于网站,必须关注:
| 维度 | 最佳实践 |
|---|---|
| 文件格式 | 优先WebP(支持有损/无损/透明度,体积比JPEG小25-35%) |
| 文件命名 | 语义化+关键词:best-mountain-view.webp 而非 IMG_1234.jpg |
| ALT标签 | 每个图片设置ALT描述(含目标关键词) |
| 尺寸适配 | 通过srcset或picture标签提供多种分辨率 |
| CDN缓存 | 使用静态资源CDN(如Cloudflare、阿里云OSS)并设置缓存策略 |
| 压缩工具 | 脚本处理后,可再用imagemin(Node.js)或pngquant做微调 |
⚠️ 关键提醒:
- 批量处理前 务必备份原始图片(使用
! os.makedirs新建输出目录) - 对于JPEG、WebP,质量参数 80~85 是视觉无损与压缩比的黄金平衡
- 若图片用于印刷(CMYK),需注意色彩空间转换(
img.convert('CMYK'))
通过脚本批量处理图片的核心思路:确定任务 → 选对工具 → 测试样本 → 全量运行。
Python/ImageMagick能覆盖90%以上的场景,Node.js适合有Web开发背景的开发者。
记住:自动化不是一步到位,建议先针对10张图测试脚本,确认无误后再对全量执行,避免误删除/破坏原始文件。
如果你有特殊需求(如批量人脸识别裁剪、图片文字OCR提取),欢迎留言补充问题!