只压缩新增的图片,压缩效果如图:
操作步骤
1. 将脚本保存到任意位置
compress_images.py
import os
import time
from PIL import Image
import sys
def compress_image(input_path, quality=75):
"""
压缩图片并直接覆盖原文件
:param input_path: 输入图片路径
:param quality: 压缩质量 (1-100)
"""
try:
# 创建临时备份文件
backup_path = f"{input_path}.bak"
os.rename(input_path, backup_path)
with Image.open(backup_path) as img:
if img.mode != 'RGB':
img = img.convert('RGB')
img.save(input_path, quality=quality, optimize=True)
# 删除备份文件
os.remove(backup_path)
print(f"成功压缩并替换: {input_path}")
except Exception as e:
print(f"处理 {input_path} 时出错: {str(e)}")
def process_directory(input_dir, quality=75, timestamp_file='.compress_timestamp'):
"""
处理目录中新增或修改的图片文件并直接覆盖原文件
:param input_dir: 输入目录
:param quality: 压缩质量 (1-100)
:param timestamp_file: 记录上次压缩时间的文件
"""
supported_extensions = ('.jpg', '.jpeg', '.png', '.webp')
# 获取上次压缩时间
last_compress_time = 0
if os.path.exists(timestamp_file):
with open(timestamp_file, 'r') as f:
last_compress_time = float(f.read())
# 遍历目录处理文件
for root, _, files in os.walk(input_dir):
for file in files:
if file.lower().endswith(supported_extensions):
input_path = os.path.join(root, file)
file_mtime = os.path.getmtime(input_path)
if file_mtime > last_compress_time:
compress_image(input_path, quality)
# 更新压缩时间记录
with open(timestamp_file, 'w') as f:
f.write(str(time.time()))
if __name__ == "__main__":
if len(sys.argv) < 2:
print("用法: python compress_images.py <输入目录> [质量(1-100)] [时间戳文件]")
sys.exit(1)
input_dir = sys.argv[1]
quality = int(sys.argv[2]) if len(sys.argv) > 2 else 75
timestamp_file = sys.argv[3] if len(sys.argv) > 3 else '.compress_timestamp'
process_directory(input_dir, quality, timestamp_file)
注意:
- 该脚本默认压缩质量为 75,可根据需要自行修改。
- 该脚本默认会在当前目录下创建一个
.compress_timestamp
文件来记录上次压缩时间,可根据需要自行修改。
2. 运行脚本
- 默认压缩
python compress_images.py content
- 自定义压缩质量
python compress_images.py content 85
- 自定义时间戳文件
python compress_images.py content 85 my_timestamp.txt