1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| import os import sys import argparse from PIL import Image
def convert_images(src_dir, dest_dir, output_format='webp'): """ 核心转换函数 :param src_dir: 源目录 :param dest_dir: 目标目录 :param output_format: 输出格式 (webp/jpg/png) """ if not os.path.exists(src_dir): print(f"错误:源目录不存在 {src_dir}") return False
os.makedirs(dest_dir, exist_ok=True) supported_formats = ['webp', 'jpg', 'jpeg', 'png'] if output_format.lower() not in supported_formats: print(f"错误:不支持的格式 {output_format}") return False
count = 0 for filename in os.listdir(src_dir): if not filename.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif', '.tiff', '.webp')): continue
try: src_path = os.path.join(src_dir, filename) dest_path = os.path.join(dest_dir, f"{os.path.splitext(filename)[0]}.{output_format}") with Image.open(src_path) as img: # 透明背景处理 if img.mode in ('RGBA', 'LA') and output_format in ('jpg', 'jpeg'): background = Image.new('RGB', img.size, (255, 255, 255)) background.paste(img, mask=img.split()[-1]) img = background # 高质量保存参数 save_args = {} if output_format == 'webp': save_args = {'quality': 100, 'method': 6} elif output_format in ('jpg', 'jpeg'): save_args = {'quality': 95} img.save(dest_path, **save_args) count += 1 print(f"转换成功: {filename} -> {os.path.basename(dest_path)}") except Exception as e: print(f"转换失败 {filename}: {str(e)}") print(f"\n转换完成! 共处理 {count} 个文件") return True
def main(): # 设置命令行参数解析 parser = argparse.ArgumentParser( description="图片格式转换工具 (命令行版)", formatter_class=argparse.RawTextHelpFormatter ) parser.add_argument('src_dir', help="源图片目录路径") parser.add_argument('dest_dir', help="输出目录路径") parser.add_argument('-f', '--format', choices=['webp', 'jpg', 'png'], default='webp', help="输出格式 (默认: webp)") # 解析参数 args = parser.parse_args() # 执行转换 convert_images(args.src_dir, args.dest_dir, args.format)
if __name__ == "__main__": main()
|