图片批量压缩脚本

代码脚本 · 其他

批量压缩目录下的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)
图片压缩批量PythonPillow

更多其他