commit 4df4e22c30f409bfe15195ad6f352d57cacffdf2 Author: 老王 Date: Wed Nov 5 14:17:26 2025 +0800 上传文件至「/」 diff --git a/convert_to_webp.py b/convert_to_webp.py new file mode 100644 index 0000000..8df1840 --- /dev/null +++ b/convert_to_webp.py @@ -0,0 +1,76 @@ +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() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..99bdff4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +Pillow +tqdm \ No newline at end of file diff --git a/run.bat b/run.bat new file mode 100644 index 0000000..ec126e3 --- /dev/null +++ b/run.bat @@ -0,0 +1,24 @@ +@echo off +echo -------------------------------------------------- +echo ⻷Ƿ... +if exist venv ( + echo ⻷Ѵڡ +) else ( + echo ⻷ڣڴ... + python -m venv venv + echo ⻷װ... + call venv\Scripts\activate.bat + pip install -r requirements.txt + goto run_script +) + +echo ⻷... +call venv\Scripts\activate.bat + +:run_script +echo תű... +python convert_to_webp.py + +echo -------------------------------------------------- +echo ɣ +pause \ No newline at end of file