compress_images.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # 图片压缩脚本
  2. from PIL import Image
  3. import os
  4. from tqdm import tqdm
  5. from io import BytesIO
  6. def auto_compress_images(input_folder, output_folder, target_size_kb):
  7. """
  8. 自动选择压缩质量以达到目标文件大小的函数
  9. :param input_folder: 输入图片文件夹路径
  10. :param output_folder: 输出图片文件夹路径
  11. :param target_size_kb: 目标文件大小 (KB)
  12. """
  13. # 创建输出文件夹
  14. os.makedirs(output_folder, exist_ok=True)
  15. # 遍历输入文件夹及其子文件夹中的所有图像文件
  16. image_files = []
  17. for root, _, files in os.walk(input_folder):
  18. for file in files:
  19. if file.lower().endswith(('.jpg', '.jpeg', '.png')):
  20. image_files.append((root, file))
  21. # 使用tqdm显示进度条
  22. for root, file in tqdm(image_files, desc="压缩进度"):
  23. input_path = os.path.join(root, file)
  24. output_path = os.path.join(output_folder, file)
  25. try:
  26. # 打开图像文件
  27. img = Image.open(input_path)
  28. # 检查并转换图像模式
  29. if img.mode not in ('RGB', 'L'):
  30. img = img.convert('RGB')
  31. # 初始质量
  32. quality = 80
  33. while True:
  34. # 在内存中保存压缩后的图像
  35. buffer = BytesIO()
  36. img.save(buffer, format='JPEG', quality=quality, optimize=True)
  37. # 获取压缩后的文件大小
  38. buffer_size_kb = len(buffer.getvalue()) / 1024
  39. if buffer_size_kb <= target_size_kb or quality <= 10:
  40. with open(output_path, 'wb') as f:
  41. f.write(buffer.getvalue())
  42. break
  43. # 减小质量进一步压缩
  44. quality -= 5
  45. except Exception as e:
  46. print(f"处理图像 {file} 时出错: {e}")
  47. # 示例用法
  48. input_folder = './book/通用书籍/2024.8.16/'
  49. output_folder = './book/通用书籍/2024.8.16/newImgs/'
  50. target_size_kb = 100 # 目标文件大小 (KB)
  51. auto_compress_images(input_folder, output_folder, target_size_kb)