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)