first commit
This commit is contained in:
66
utils/image_optimizer.py
Normal file
66
utils/image_optimizer.py
Normal file
@@ -0,0 +1,66 @@
|
||||
# utils/image_optimizer.py
|
||||
"""
|
||||
Утилиты для оптимизации изображений
|
||||
"""
|
||||
|
||||
from PIL import Image
|
||||
import os
|
||||
from pathlib import Path
|
||||
import logging
|
||||
|
||||
|
||||
class ImageOptimizer:
|
||||
"""Оптимизатор изображений"""
|
||||
|
||||
def __init__(self, quality=85, max_size=(1200, 1200)):
|
||||
self.quality = quality
|
||||
self.max_size = max_size
|
||||
self.logger = logging.getLogger(__name__)
|
||||
|
||||
def optimize_image(self, image_path, output_path=None):
|
||||
"""Оптимизирует одно изображение"""
|
||||
if output_path is None:
|
||||
output_path = image_path
|
||||
|
||||
try:
|
||||
with Image.open(image_path) as img:
|
||||
# Конвертируем в RGB если нужно
|
||||
if img.mode in ('RGBA', 'LA', 'P'):
|
||||
background = Image.new('RGB', img.size, (255, 255, 255))
|
||||
if img.mode == 'P':
|
||||
img = img.convert('RGBA')
|
||||
if img.mode in ('RGBA', 'LA'):
|
||||
background.paste(img, mask=img.split()[-1])
|
||||
img = background
|
||||
|
||||
# Изменяем размер если нужно
|
||||
if img.size[0] > self.max_size[0] or img.size[1] > self.max_size[1]:
|
||||
img.thumbnail(self.max_size, Image.Resampling.LANCZOS)
|
||||
|
||||
# Сохраняем с оптимизацией
|
||||
img.save(output_path, 'JPEG', quality=self.quality, optimize=True)
|
||||
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error optimizing image {image_path}: {e}")
|
||||
return False
|
||||
|
||||
def optimize_directory(self, directory_path, extensions=None):
|
||||
"""Оптимизирует все изображения в директории"""
|
||||
if extensions is None:
|
||||
extensions = ['.jpg', '.jpeg', '.png', '.webp']
|
||||
|
||||
directory = Path(directory_path)
|
||||
optimized_count = 0
|
||||
error_count = 0
|
||||
|
||||
for file_path in directory.rglob('*'):
|
||||
if file_path.suffix.lower() in extensions:
|
||||
if self.optimize_image(file_path):
|
||||
optimized_count += 1
|
||||
else:
|
||||
error_count += 1
|
||||
|
||||
print(f"Optimized {optimized_count} images, {error_count} errors")
|
||||
return optimized_count, error_count
|
||||
Reference in New Issue
Block a user