本文目录导读:

- 方案一:基于命令行工具
ImageMagick(最通用, 跨平台) - 方案二:基于
tinypngAPI (最佳质量与文件大小平衡) - 方案三:基于 Node.js 的
sharp库 (速度极快, 无网络依赖) - 方案四:Python 脚本 (使用
Pillow库) - 总结建议
是的,实用脚本可以自动压缩图片质量,这在网页开发、应用开发、批量处理图片等场景中非常实用。
下面提供几种常见且高效的脚本方案,分别适用于命令行(程序员友好)、桌面环境(右键一键处理)以及特定语言(Node.js/Python)。
基于命令行工具 ImageMagick (最通用, 跨平台)
ImageMagick 是一个强大的图像处理套件,几乎所有Linux/Mac/Windows都支持。
脚本示例 (Bash / Shell - 批量压缩当前目录所有jpg/png):
#!/bin/bash
# compress_images.sh
# 设置压缩质量 (1-100, 数值越小文件越小, 质量越低)
QUALITY=80
# 创建输出目录
OUTPUT_DIR="./compressed"
mkdir -p "$OUTPUT_DIR"
# 压缩所有JPG文件
for img in *.jpg *.jpeg *.png; do
if [ -f "$img" ]; then
echo "正在压缩: $img"
convert "$img" -quality "$QUALITY" "$OUTPUT_DIR/$img"
fi
done
echo "所有图片已压缩至 $OUTPUT_DIR 目录"
使用方法:
- 安装 ImageMagick (
brew install imagemagick或在Windows下载安装包)。 - 将以上代码保存为
compress.sh。 - 在图片所在目录执行:
chmod +x compress.sh && ./compress.sh
优点:功能强大,支持格式多,质量可控。
缺点:对于PNG,-quality参数效果不如专用工具(如PNGQuant)好。
基于 tinypng API (最佳质量与文件大小平衡)
TinyPNG 是业界公认的压缩网站,它提供了官方API脚本,压缩效果几乎无损,且文件体积减小非常明显,免费版每月可压500张。
脚本示例 (Node.js - 需要安装依赖):
// compress_images.js
const tinify = require("tinify");
const fs = require("fs");
const path = require("path");
// 1. 去 https://tinypng.com/developers 注册获取API Key
tinify.key = "YOUR_API_KEY";
const inputDir = "./images"; // 原始图片目录
const outputDir = "./compressed"; // 输出目录
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir);
}
// 读取目录下所有图片
fs.readdirSync(inputDir).forEach((file) => {
const ext = path.extname(file).toLowerCase();
if ([".jpg", ".jpeg", ".png", ".webp"].includes(ext)) {
const sourcePath = path.join(inputDir, file);
const destPath = path.join(outputDir, file);
// 使用TinyPNG进行压缩
tinify.fromFile(sourcePath).toFile(destPath).then(() => {
console.log(`压缩成功: ${file}`);
}).catch(err => {
console.error(`压缩失败 ${file}:`, err.message);
});
}
});
使用方法:
npm init -ynpm install tinify- 替换
YOUR_API_KEY,运行node compress_images.js
优点:效果极佳,支持WebP,自动优化。 缺点:需要网络,免费版有数量限制。
基于 Node.js 的 sharp 库 (速度极快, 无网络依赖)
如果你需要纯粹的本地脚本来处理高质量图片,sharp 是最佳选择之一,它基于libvips,处理速度非常快。
脚本示例 (Node.js - 批量压缩):
// compress_sharp.js
const sharp = require('sharp');
const fs = require('fs');
const path = require('path');
const inputDir = './input';
const outputDir = './output';
if (!fs.existsSync(outputDir)) {
fs.mkdirSync(outputDir);
}
fs.readdirSync(inputDir).forEach(file => {
const ext = path.extname(file).toLowerCase();
if (['.jpg', '.jpeg', '.png', '.webp'].includes(ext)) {
const inputPath = path.join(inputDir, file);
const outputPath = path.join(outputDir, file);
let pipeline = sharp(inputPath);
if (ext === '.png') {
// PNG压缩 (0-9, 9为最压缩)
pipeline = pipeline.png({ compressionLevel: 9, palette: true });
} else {
// JPEG/WebP 压缩 (1-100, 80左右平衡)
pipeline = pipeline.jpeg({ quality: 80, mozjpeg: true });
}
pipeline.toFile(outputPath)
.then(() => console.log(`压缩完成: ${file}`))
.catch(err => console.error(`错误: ${file}`, err));
}
});
使用方法:
npm init -ynpm install sharp- 放入图片,运行
node compress_sharp.js
优点:纯本地,速度快,质量可控,支持格式多。 缺点:需要Node.js环境。
Python 脚本 (使用 Pillow 库)
对于熟悉Python的用户,这是一个可靠的方案。
# compress_images.py
from PIL import Image
import os
input_dir = "./input"
output_dir = "./output"
quality = 85 # JPEG质量
png_compress_level = 9 # PNG压缩等级 (0-9)
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for filename in os.listdir(input_dir):
if filename.lower().endswith(('.png', '.jpg', '.jpeg')):
img_path = os.path.join(input_dir, filename)
img = Image.open(img_path)
# 转换为RGB模式以支持JPEG
if img.mode in ("RGBA", "P"):
img = img.convert("RGB")
output_path = os.path.join(output_dir, filename)
if filename.lower().endswith('.png'):
# 对于PNG,Pillow不支持直接设置quality,需要通过优化参数
img.save(output_path, optimize=True, compress_level=png_compress_level)
else:
img.save(output_path, optimize=True, quality=quality)
print(f"压缩完成: {filename}")
print("所有图片处理完毕!")
使用方法:
pip install Pillow- 运行
python compress_images.py
优点:简单,Python生态好。 缺点:PNG压缩效果不如专用工具。
总结建议
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 快速批量处理 | ImageMagick (方案一) | 无需编程,一条命令搞定 |
| 追求极致压缩效果 | TinyPNG API (方案二) | 视觉无损,效果最好 |
| 需要在线/批量处理 | Shubox / Kraken.io (在线服务) | 无需安装任何东西,直接上传 |
| 高性能本地处理 | Sharp (方案三) | 比Pillow快几倍,支持格式多 |
| Python生态内 | Pillow (方案四) | 集成到现有Python项目最方便 |
小提示:对于最重要的图片,建议先备份原始文件,然后使用TinyPNG或Sharp的quality: 80-85参数,这样可以在文件大小和质量之间取得很好的平衡。