Как на Python написать скрипт для автоматического сжатия всех изображений в папке на 50% без заметной потери качества (библиотека Pillow)?
Для автоматического сжатия изображений в папке с помощью библиотеки Pillow нужно установить её командой `pip install Pillow`, после чего можно написать полноценный скрипт.
**Готовый скрипт для сжатия изображений:**
python
import os
from PIL import Image
def compress_images(input_folder, output_folder, quality=85):
os.makedirs(output_folder, exist_ok=True)
supported_formats = (‘.jpg’, ‘.jpeg’, ‘.png’, ‘.webp’, ‘.bmp’)
for filename in os.listdir(input_folder):
if filename.lower().endswith(supported_formats):
input_path = os.path.join(input_folder, filename)
output_path = os.path.join(output_folder, filename)
with Image.open(input_path) as img:
# Уменьшаем размер на 50%
new_width = img.width // 2
new_height = img.height // 2
resized_img = img.resize((new_width, new_height), Image.LANCZOS)
# Сохраняем с оптимизацией
if filename.lower().endswith(‘.png’):
resized_img.save(output_path, optimize=True)
else:
resized_img.save(output_path, quality=quality, optimize=True)
original_size = os.path.getsize(input_path)
compressed_size = os.path.getsize(output_path)
print(f»{filename}: {original_size // 1024} KB → {compressed_size // 1024} KB»)
compress_images(‘input_images’, ‘output_images’)
**Ключевые моменты скрипта:**
1. **Метод ресайза LANCZOS** — один из лучших алгоритмов масштабирования, минимизирует артефакты и сохраняет чёткость краёв при уменьшении размера.
2. **Параметр quality=85** — оптимальное значение для JPEG: визуально изображение практически неотличимо от оригинала, но файл весит значительно меньше. Значение 75–90 считается «золотым стандартом».
3. **Флаг optimize=True** — включает дополнительную оптимизацию алгоритма сжатия без потери качества.
4. **Раздельная обработка PNG** — PNG использует lossless-сжатие, поэтому параметр quality к нему не применяется; вместо этого используется только optimize.
**Дополнительные улучшения:**
— Добавьте `img.convert(‘RGB’)` перед сохранением JPEG, если исходники могут быть в режиме RGBA (например, PNG с прозрачностью).
— Используйте `os.walk()` вместо `os.listdir()` для рекурсивной обработки вложенных папок.
— Для WebP-формата укажите `method=6` при сохранении — это обеспечит лучшее сжатие при том же качестве.
**Итог:** уменьшение размеров изображения в 2 раза (50%) в сочетании с quality=85 и optimize=True даёт сокращение размера файла в 3–6 раз без заметной потери качества при просмотре на экране.
