| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- import os
- from PIL import Image
- def process_directory(directory, max_file_size_kb, min_resolution=(800, 600)):
- """
- Рекурсивно обрабатываем все изображения в каталоге.
-
- :param directory: Каталог для обработки
- :param max_file_size_mb: Максимально допустимый размер файла в килобайтах
- :param min_resolution: Минимальное разрешение изображения после масштабирования
- """
- for root, dirs, files in os.walk(directory):
- for file_name in files:
- if file_name.lower().endswith(('.jpg', '.jpeg', '.png')):
- full_path = os.path.join(root, file_name)
-
- # Проверяем размер файла
- size_in_bytes = os.path.getsize(full_path)
- size_in_kb = size_in_bytes / 1024
-
- if size_in_kb > max_file_size_kb:
- print(f'Обрабатываю {full_path}')
-
- try:
- with Image.open(full_path) as img:
- width, height = img.size
- if img.mode in ("RGBA", "P"):
- # Convert the image to RGB mode
- img = img.convert("RGB")
- # Вычисляем новое разрешение пропорционально старому,
- # сохраняя минимальные значения ширины и высоты
- new_width = int(min(width, min_resolution[0]))
- new_height = int(min(height, min_resolution[1]))
-
- resized_img = img.resize((new_width, new_height))
-
- # Определяем выходной путь временного файла
- temp_output_path = f'{os.path.splitext(full_path)[0]}_temp.jpg'
-
- # Сохраняем изображение с меньшим разрешением и уровнем качества
- resize_quality = 80 # Начальная степень сжатия
- while True:
- reduced_size_in_bytes = os.path.getsize(temp_output_path) if os.path.exists(temp_output_path) else float('inf')
-
- if reduced_size_in_bytes <= size_in_bytes or resize_quality <= 10:
- break
-
- resize_quality -= 10
- resized_img.save(temp_output_path, 'JPEG', optimize=True, quality=resize_quality)
-
- # Перезаписываем оригинальный файл
- os.replace(temp_output_path, full_path)
- print(f'Файл успешно обработан: {file_name}, Новый размер: {round(os.path.getsize(full_path)/(1024*1024), 2)} MB')
- except Exception as e:
- print(f'Ошибка при обработке файла {full_path}: {e}')
- target_dir = "D:\\_gogs\\ISRPO"
- max_file_size_mb = 100 # "Максимальный размер файла в килобайтах (например, 2): "
- process_directory(target_dir, max_file_size_mb)
|