图片批量压缩脚本
批量压缩目录下的JPG/PNG图片,支持设置质量和最大尺寸,大幅减小文件体积。
详细内容
#!/usr/bin/env python3
# 图片批量压缩脚本
# 依赖: pip install Pillow
# 使用方法: python3 image_compress.py <图片目录>
import os
import sys
from PIL import Image
def compress_image(input_path, output_path, quality=80, max_size=1920):
"""
压缩单张图片
:param quality: 压缩质量 1-100
:param max_size: 最大边长(像素)
"""
try:
img = Image.open(input_path)
# 如果超过最大尺寸,等比例缩放
if max(img.size) > max_size:
ratio = max_size / max(img.size)
new_size = (int(img.size[0] * ratio), int(img.size[1] * ratio))
img = img.resize(new_size, Image.LANCZOS)
# 保存压缩
if img.mode in ('RGBA', 'P'):
img = img.convert('RGB')
img.save(output_path, 'JPEG', quality=quality, optimize=True)
return True
except Exception as e:
print(f" 压缩失败 {input_path}: {e}")
return False
def batch_compress(directory, quality=80, max_size=1920):
"""批量压缩目录下的图片"""
output_dir = os.path.join(directory, "compressed")
os.makedirs(output_dir, exist_ok=True)
image_extensions = ('.jpg', '.jpeg', '.png', '.bmp', '.webp')
images = [f for f in os.listdir(directory)
if f.lower().endswith(image_extensions)]
print(f"找到 {len(images)} 张图片")
print(f"输出目录: {output_dir}")
print(f"压缩质量: {quality}, 最大尺寸: {max_size}px")
print("-" * 50)
total_original = 0
total_compressed = 0
for i, filename in enumerate(images, 1):
input_path = os.path.join(directory, filename)
output_path = os.path.join(output_dir,
os.path.splitext(filename)[0] + '.jpg')
original_size = os.path.getsize(input_path)
total_original += original_size
if compress_image(input_path, output_path, quality, max_size):
compressed_size = os.path.getsize(output_path)
total_compressed += compressed_size
ratio = (1 - compressed_size / original_size) * 100
print(f" [{i}/{len(images)}] {filename}: "
f"{original_size//1024}KB → {compressed_size//1024}KB "
f"(节省{ratio:.1f}%)")
print("-" * 50)
print(f"总计: {total_original//1024}KB → {total_compressed//1024}KB "
f"(节省{(1-total_compressed/total_original)*100:.1f}%)")
if __name__ == '__main__':
if len(sys.argv) < 2:
print("使用方法: python3 image_compress.py <图片目录> [质量] [最大尺寸]")
print("示例: python3 image_compress.py ./images 80 1920")
sys.exit(1)
directory = sys.argv[1]
quality = int(sys.argv[2]) if len(sys.argv) > 2 else 80
max_size = int(sys.argv[3]) if len(sys.argv) > 3 else 1920
batch_compress(directory, quality, max_size)