1
0

compress_jpg.py 3.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import os
  2. from PIL import Image
  3. def process_directory(directory, max_file_size_kb, min_resolution=(800, 600)):
  4. """
  5. Рекурсивно обрабатываем все изображения в каталоге.
  6. :param directory: Каталог для обработки
  7. :param max_file_size_mb: Максимально допустимый размер файла в килобайтах
  8. :param min_resolution: Минимальное разрешение изображения после масштабирования
  9. """
  10. for root, dirs, files in os.walk(directory):
  11. for file_name in files:
  12. if file_name.lower().endswith(('.jpg', '.jpeg', '.png')):
  13. full_path = os.path.join(root, file_name)
  14. # Проверяем размер файла
  15. size_in_bytes = os.path.getsize(full_path)
  16. size_in_kb = size_in_bytes / 1024
  17. if size_in_kb > max_file_size_kb:
  18. print(f'Обрабатываю {full_path}')
  19. try:
  20. with Image.open(full_path) as img:
  21. width, height = img.size
  22. if img.mode in ("RGBA", "P"):
  23. # Convert the image to RGB mode
  24. img = img.convert("RGB")
  25. # Вычисляем новое разрешение пропорционально старому,
  26. # сохраняя минимальные значения ширины и высоты
  27. new_width = int(min(width, min_resolution[0]))
  28. new_height = int(min(height, min_resolution[1]))
  29. resized_img = img.resize((new_width, new_height))
  30. # Определяем выходной путь временного файла
  31. temp_output_path = f'{os.path.splitext(full_path)[0]}_temp.jpg'
  32. # Сохраняем изображение с меньшим разрешением и уровнем качества
  33. resize_quality = 80 # Начальная степень сжатия
  34. while True:
  35. reduced_size_in_bytes = os.path.getsize(temp_output_path) if os.path.exists(temp_output_path) else float('inf')
  36. if reduced_size_in_bytes <= size_in_bytes or resize_quality <= 10:
  37. break
  38. resize_quality -= 10
  39. resized_img.save(temp_output_path, 'JPEG', optimize=True, quality=resize_quality)
  40. # Перезаписываем оригинальный файл
  41. os.replace(temp_output_path, full_path)
  42. print(f'Файл успешно обработан: {file_name}, Новый размер: {round(os.path.getsize(full_path)/(1024*1024), 2)} MB')
  43. except Exception as e:
  44. print(f'Ошибка при обработке файла {full_path}: {e}')
  45. target_dir = "D:\\_gogs\\ISRPO"
  46. max_file_size_mb = 100 # "Максимальный размер файла в килобайтах (например, 2): "
  47. process_directory(target_dir, max_file_size_mb)