#!/usr/bin/env python3
"""
快速图片压缩脚本
将图片压缩到适合豆包 API 的大小
"""
import sys
from pathlib import Path
try:
from PIL import Image
except ImportError:
print("错误: 需要安装 Pillow")
print("运行: pip install Pillow")
sys.exit(1)
def compress_image(input_path: str, output_path: str = None, quality: int = 85):
"""压缩图片
Args:
input_path: 输入图片路径
output_path: 输出图片路径(可选,默认覆盖原文件)
quality: JPEG 质量 (1-100,默认85)
"""
path = Path(input_path)
if not path.exists():
print(f"错误: 文件不存在: {input_path}")
return False
# 生成输出路径
if output_path is None:
output_path = path.parent / f"{path.stem}_compressed{path.suffix}"
output_path = Path(output_path)
# 读取原始文件
original_size = path.stat().st_size
original_mb = original_size / (1024 * 1024)
print(f"原始文件: {path.name}")
print(f"原始大小: {original_mb:.2f} MB")
# 打开并处理图片
with Image.open(path) as img:
# 转换为 RGB
if img.mode != 'RGB':
img = img.convert('RGB')
# 调整大小(如果太大)
max_size = (1920, 1080)
if img.size[0] > max_size[0] or img.size[1] > max_size[1]:
print(f"调整大小: {img.size} -> ...")
img.thumbnail(max_size, Image.Resampling.LANCZOS)
# 压缩并保存
img.save(output_path, 'JPEG', quality=quality, optimize=True)
# 检查结果
compressed_size = output_path.stat().st_size
compressed_mb = compressed_size / (1024 * 1024)
reduction = (1 - compressed_size / original_size) * 100
print(f"压缩后: {output_path.name}")
print(f"压缩后大小: {compressed_mb:.2f} MB")
print(f"压缩率: {reduction:.1f}%")
# 评估
if compressed_mb < 1:
print("✓ 完美!大小适合快速上传")
elif compressed_mb < 2:
print("✓ 大小可接受")
else:
print("⚠️ 仍然较大,可能需要进一步压缩")
return True
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法: python compress.py <图片路径> [输出路径] [质量]")
print("示例: python compress.py D:/download/photo.jpg")
print("示例: python compress.py photo.jpg compressed.jpg 80")
sys.exit(1)
input_file = sys.argv[1]
output_file = sys.argv[2] if len(sys.argv) > 2 else None
quality = int(sys.argv[3]) if len(sys.argv) > 3 else 85
print("="*50)
print("图片压缩工具")
print("="*50)
compress_image(input_file, output_file, quality)