Files
img-webp/convert_to_webp.py
2025-11-05 14:17:26 +08:00

76 lines
3.1 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import os
from pathlib import Path
from PIL import Image
def convert_images_to_webp_in_out_dir():
"""
将脚本所在目录下的所有支持的图片格式转换为 WebP 格式,并输出到 'out' 子目录。
功能:
- 高质量压缩 (quality=85, method=6)。
- 保留图片透明度。
- 不删除原始文件。
- 自动创建 'out' 目录用于存放结果。
- 自动跳过在 'out' 目录中已存在的同名 WebP 文件。
"""
try:
# 使用 pathlib 获取脚本所在的目录,这是更现代、更健壮的方式
script_dir = Path(__file__).parent
output_dir = script_dir / 'out'
# 创建输出目录,如果目录已存在则什么也不做
output_dir.mkdir(exist_ok=True)
# 支持转换的图片格式列表
supported_formats = ['.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff']
print("--- 开始处理图片转换任务 ---")
print(f"源目录: {script_dir}")
print(f"输出目录: {output_dir}")
print("-" * 30)
# 遍历目录中的所有文件
for file_path in script_dir.iterdir():
# 只处理文件,跳过子目录
if not file_path.is_file():
continue
# 检查文件扩展名是否在支持的格式列表中 (忽略大小写)
if file_path.suffix.lower() in supported_formats:
output_path = output_dir / f"{file_path.stem}.webp"
# 如果同名的 webp 文件已存在,则跳过
if output_path.exists():
print(f"跳过: {file_path.name} (目标文件已存在)")
continue
try:
# 打开图片文件
with Image.open(file_path) as img:
# Pillow 的 WebP 保存器会自动处理 RGBA (带透明通道) 和 RGB 模式。
# 对于 GIF 动图,默认只保存第一帧。
# 保存为 WebP
# quality: 质量参数1-100。85 是在质量和体积之间很好的平衡点。
# method: 压缩算法0-6。6 是最慢但压缩效果最好的。
img.save(output_path, 'webp', quality=85, method=6)
original_size_kb = file_path.stat().st_size / 1024
new_size_kb = output_path.stat().st_size / 1024
print(f"成功: {file_path.name} ({original_size_kb:.1f} KB) -> out/{output_path.name} ({new_size_kb:.1f} KB)")
except Exception as e:
print(f"失败: 转换 {file_path.name} 时发生错误: {e}")
print("-" * 30)
print("--- 所有图片处理完成! ---")
except NameError:
print("错误: 此脚本似乎不是作为文件直接运行的。请将其保存为 .py 文件后执行。")
except Exception as e:
print(f"发生意外错误: {e}")
if __name__ == '__main__':
convert_images_to_webp_in_out_dir()