#!/usr/bin/env python3 """自动压缩图片,无需交互""" import os import subprocess from pathlib import Path MAX_WIDTH = 2180 SOURCE_DIR = Path('/home/ubuntu/images') BACKUP_DIR = SOURCE_DIR / 'original_backup' def get_size(f): try: r = subprocess.run(['identify', '-format', '%w %h', str(f)], capture_output=True, text=True) return map(int, r.stdout.strip().split()) except: return None, None def resize(f, out): try: cmd = ['convert', str(f), '-resize', f'{MAX_WIDTH}x>', '-quality', '90', str(out)] subprocess.run(cmd, check=True, capture_output=True) return True except Exception as e: print(f" 失败: {e}") return False # 创建备份目录 BACKUP_DIR.mkdir(exist_ok=True) exts = {'.jpg', '.jpeg', '.png', '.webp'} images = [] for f in SOURCE_DIR.iterdir(): if f.is_file() and f.suffix.lower() in exts: w, h = get_size(f) if w and w > MAX_WIDTH: images.append({'file': f, 'w': w, 'h': h}) print(f"压缩 {len(images)} 张图片...\n") success = 0 for i, item in enumerate(images, 1): f = item['file'] print(f"[{i}/{len(images)}] {f.name}") # 备份 backup = BACKUP_DIR / f.name os.rename(f, backup) # 压缩 if resize(backup, f): nw, nh = get_size(f) orig_kb = backup.stat().st_size / 1024 new_kb = f.stat().st_size / 1024 print(f" {item['w']}x{item['h']} → {nw}x{nh}") print(f" {orig_kb:.1f}KB → {new_kb:.1f}KB\n") success += 1 else: os.rename(backup, f) print(f"✅ 完成: {success}/{len(images)} 张") print(f"📁 备份: {BACKUP_DIR}")