1. 实际应用场景与痛点
场景
在办公或教学场景中,我们常需要把多张高分辨率图片插入 PPT 或发送邮件附件,但:
- 高分辨率图片体积大(几 MB 甚至几十 MB)
- 邮件附件有大小限制(如 5MB~20MB)
- PPT 文件体积过大会影响打开和分享速度
- 手动压缩费时且容易失真
痛点
- 手动一张张压缩很慢
- 在线压缩工具有隐私风险
- 批量处理时无法保证统一质量
- 需要兼顾清晰度和文件大小
2. 核心逻辑讲解
1. 输入:指定文件夹路径,读取所有常见图片格式(jpg, png, jpeg, bmp, webp)
2. 压缩策略:
- 对 JPEG:使用
"Pillow" 调整质量参数(quality=85 左右)
- 对 PNG:先尝试转换为 JPEG(如果无透明背景),否则用
"optipng" 或
"tinify" API 无损压缩
- 保持宽高不变,只改压缩质量
3. 输出:保存到新目录,文件名加
"_compressed" 后缀
4. 批量处理:遍历文件夹,支持递归子目录
5. 可选 AI 增强(高级版):用
"OpenCV" + 超分辨率模型(如 ESRGAN)先提升细节再压缩,保证小体积下更清晰
3. 项目结构
image_compressor/
├── compressor.py # 主程序
├── utils.py # 工具函数
├── config.py # 配置参数
├── requirements.txt # 依赖
├── README.md # 使用说明
└── sample_images/ # 示例图片
4. 代码实现
"config.py"
# 配置参数
COMPRESS_QUALITY = 85 # JPEG 压缩质量 (1-100)
OUTPUT_SUFFIX = "_compressed" # 输出文件后缀
SUPPORTED_FORMATS = ('.jpg', '.jpeg', '.png', '.bmp', '.webp')
MAX_WIDTH = 1920 # 可选:限制最大宽度
"utils.py"
import os
from PIL import Image
def is_supported_format(filename):
return filename.lower().endswith(SUPPORTED_FORMATS)
def get_output_path(input_path, output_dir):
base_name = os.path.splitext(os.path.basename(input_path))[0]
ext = os.path.splitext(input_path)[1]
if ext.lower() == '.png':
# 尝试转 JPEG 如果无透明
img = Image.open(input_path)
if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info):
return os.path.join(output_dir, base_name + OUTPUT_SUFFIX + ext)
else:
ext = '.jpg'
return os.path.join(output_dir, base_name + OUTPUT_SUFFIX + ext)
"compressor.py"
import os
import sys
from PIL import Image
from utils import is_supported_format, get_output_path
import config
def compress_image(input_path, output_path):
try:
with Image.open(input_path) as img:
# 可选:限制最大宽度
if config.MAX_WIDTH and img.width > config.MAX_WIDTH:
ratio = config.MAX_WIDTH / float(img.width)
new_height = int(img.height * ratio)
img = img.resize((config.MAX_WIDTH, new_height), Image.ANTIALIAS)
# 保存
if output_path.lower().endswith('.jpg') or output_path.lower().endswith('.jpeg'):
img = img.convert('RGB')
img.save(output_path, 'JPEG', quality=config.COMPRESS_QUALITY, optimize=True)
else:
img.save(output_path, optimize=True)
print(f"Compressed: {input_path} -> {output_path}")
except Exception as e:
print(f"Error compressing {input_path}: {e}")
def batch_compress(input_dir, output_dir):
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for root, _, files in os.walk(input_dir):
for file in files:
if is_supported_format(file):
input_path = os.path.join(root, file)
rel_path = os.path.relpath(root, input_dir)
out_subdir = os.path.join(output_dir, rel_path)
if not os.path.exists(out_subdir):
os.makedirs(out_subdir)
output_path = get_output_path(input_path, out_subdir)
compress_image(input_path, output_path)
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python compressor.py <input_folder> <output_folder>")
sys.exit(1)
batch_compress(sys.argv[1], sys.argv[2])
5.
"requirements.txt"
Pillow>=9.0.0
6. README.md
# 批量图片压缩工具
适用于 PPT / 邮件场景,批量压缩图片,保持清晰度,减少文件体积。
## 功能
- 支持 JPG, PNG, BMP, WEBP
- 自动转换 PNG 为 JPG(若无透明)
- 可限制最大宽度
- 批量处理子目录
## 安装
bash
pip install -r requirements.txt
## 使用
bash
python compressor.py ./sample_images ./output_images
## 配置
修改 `config.py` 调整压缩质量、最大宽度等参数。
7. 核心知识点卡片
知识点 说明
Pillow Python 图像处理库,支持多种格式读写与压缩
质量参数 JPEG 的 quality 值影响文件大小与画质平衡
透明度检测 PNG 转 JPG 前需检查透明通道
批量遍历
"os.walk" 递归遍历目录
优化配置
"optimize=True" 让 Pillow 进一步优化文件结构
8. 总结
这个工具解决了办公中图片过大的痛点,通过 Python 脚本实现批量、自动化、可配置的压缩流程,适合 PPT 制作、邮件发送等场景。
后续可扩展:
- 接入 Tinify API 进行智能压缩
- 使用 OpenCV + ESRGAN 做超分辨率预处理
- 添加 GUI 界面方便非技术人员使用
如果你愿意,可以写一个 带进度条和并行处理的增强版本,这样在处理大量图片时会更快。
利用AI高效解决实际问题,如果你觉得这个工具好用,欢迎关注我!