refactor: Move image processing configuration to settings
Refactored image processing system to use centralized configuration in settings.IMAGE_PROCESSING_CONFIG instead of hardcoded values. Changes: - Added IMAGE_PROCESSING_CONFIG to settings with configurable sizes, formats, and quality - Rewrote ImageProcessor to use dynamic configuration from settings - Added support for multiple image formats (JPEG, WebP, PNG) - Updated _save_image_version() to handle different formats and quality levels - Added original image scaling (max 2160×2160) and square aspect ratio - Updated ImageService to work with different file extensions (.jpg, .webp, .png) - All parameters now easily configurable without code changes Configuration: - Original: JPEG, quality 100, max 2160×2160 (always square) - Large: WebP, quality 90, 1200×1200 - Medium: WebP, quality 85, 600×600 - Thumbnail: WebP, quality 80, 200×200 Benefits: - Flexible and maintainable configuration - Smaller file sizes (WebP for resized images) - Maximum quality for originals (JPEG 100) - Square aspect ratio for better consistency 🤖 Generated with Claude Code Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
234
IMAGE_CONFIGURATION_REPORT.md
Normal file
234
IMAGE_CONFIGURATION_REPORT.md
Normal file
@@ -0,0 +1,234 @@
|
||||
# Отчет: Вынос конфигурации размеров и форматов изображений в settings
|
||||
|
||||
## Резюме
|
||||
|
||||
Успешно вынесена конфигурация размеров, форматов и качества изображений из кода в `settings.IMAGE_PROCESSING_CONFIG`. Система теперь поддерживает разные форматы (JPEG для оригинала, WebP для других размеров) с динамическими параметрами качества.
|
||||
|
||||
---
|
||||
|
||||
## Что было реализовано
|
||||
|
||||
### 1. ✓ Добавлена конфигурация в settings.py
|
||||
|
||||
**Файл:** `myproject/myproject/settings.py:130-173`
|
||||
|
||||
```python
|
||||
IMAGE_PROCESSING_CONFIG = {
|
||||
'formats': {
|
||||
'original': {
|
||||
'format': 'JPEG',
|
||||
'quality': 100,
|
||||
'max_width': 2160,
|
||||
'max_height': 2160,
|
||||
'description': 'Original image (4K max, JPEG format)'
|
||||
},
|
||||
'large': {
|
||||
'format': 'WEBP',
|
||||
'quality': 90,
|
||||
'width': 1200,
|
||||
'height': 1200,
|
||||
'description': 'Large image (1200x1200, WebP format)'
|
||||
},
|
||||
'medium': {
|
||||
'format': 'WEBP',
|
||||
'quality': 85,
|
||||
'width': 600,
|
||||
'height': 600,
|
||||
'description': 'Medium image (600x600, WebP format)'
|
||||
},
|
||||
'thumbnail': {
|
||||
'format': 'WEBP',
|
||||
'quality': 80,
|
||||
'width': 200,
|
||||
'height': 200,
|
||||
'description': 'Thumbnail (200x200, WebP format)'
|
||||
},
|
||||
},
|
||||
'folders': {
|
||||
'original': 'originals',
|
||||
'large': 'large',
|
||||
'medium': 'medium',
|
||||
'thumbnail': 'thumbnails',
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. ✓ Полностью переписан ImageProcessor
|
||||
|
||||
**Файл:** `myproject/products/utils/image_processor.py`
|
||||
|
||||
**Основные изменения:**
|
||||
- Все SIZES, SIZE_FOLDERS и JPEG_QUALITY теперь берутся из settings
|
||||
- Добавлены методы для динамического получения конфигурации:
|
||||
- `_get_config()` - получить конфигурацию из settings
|
||||
- `_get_size_dimensions(size_key)` - получить размеры для типа изображения
|
||||
- `_get_format_config(size_key)` - получить конфиг формата
|
||||
- `_get_folder(size_key)` - получить папку для сохранения
|
||||
|
||||
- Полностью переработан метод `_save_image_version()`:
|
||||
- Поддерживает разные форматы (JPEG, WebP, PNG)
|
||||
- Использует качество из конфигурации для каждого типа
|
||||
- Определяет расширение файла в зависимости от формата
|
||||
- Масштабирует оригинал если больше 2160×2160
|
||||
- **Делает изображение квадратным** (добавляет белый фон если нужно)
|
||||
|
||||
- Обновлена функция `delete_all_versions()`:
|
||||
- Учитывает разные расширения файлов при удалении
|
||||
- Работает с новой структурой конфигурации
|
||||
|
||||
### 3. ✓ Обновлен ImageService
|
||||
|
||||
**Файл:** `myproject/products/utils/image_service.py`
|
||||
|
||||
**Основные изменения:**
|
||||
- Добавлены методы для работы с конфигурацией:
|
||||
- `_get_config()` - получить конфигурацию
|
||||
- `_get_size_folders()` - получить папки из конфигурации
|
||||
- `_get_format_config(size_key)` - получить конфиг формата
|
||||
- `_get_file_extension(size_key)` - получить расширение для типа
|
||||
|
||||
- Полностью переработан метод `get_url()`:
|
||||
- Поддерживает разные расширения (.jpg, .webp, .png)
|
||||
- Корректно парсит имена файлов с разными расширениями
|
||||
- Генерирует правильный URL для каждого размера с его расширением
|
||||
|
||||
---
|
||||
|
||||
## Поддерживаемые форматы
|
||||
|
||||
| Формат | Тип | Поддержка | Примечание |
|
||||
|--------|-----|----------|-----------|
|
||||
| **JPEG** | Оригинал | ✓ | Качество: 100 |
|
||||
| **WebP** | Large, Medium, Thumbnail | ✓ | Оптимизация размера |
|
||||
| **PNG** | Все | ✓ | При необходимости |
|
||||
| **GIF** | Входной | ✓ | Конвертируется в RGB |
|
||||
| **TIFF** | Входной | ✓ | Конвертируется в RGB |
|
||||
| **HEIC** | Входной | ✓ | Конвертируется в RGB |
|
||||
|
||||
---
|
||||
|
||||
## Размеры и качество
|
||||
|
||||
| Тип | Размер | Формат | Качество |
|
||||
|-----|--------|--------|----------|
|
||||
| **Original** | 2160×2160 макс | JPEG | 100 |
|
||||
| **Large** | 1200×1200 | WebP | 90 |
|
||||
| **Medium** | 600×600 | WebP | 85 |
|
||||
| **Thumbnail** | 200×200 | WebP | 80 |
|
||||
|
||||
---
|
||||
|
||||
## Логика масштабирования оригинала
|
||||
|
||||
**Для оригинала (original):**
|
||||
1. Если размер больше 2160×2160 → масштабировать с сохранением пропорций
|
||||
2. Если размер меньше или равен 2160×2160 → оставить как есть
|
||||
3. **Всегда делать квадратным** → добавить белый фон если нужно
|
||||
|
||||
**Примеры:**
|
||||
- 3000×2000 → масштабируется до ≈2160×1440, потом до 2160×2160 (с белым фоном)
|
||||
- 1000×1000 → остается 1000×1000, потом до 1000×1000 квадратное (без изменений)
|
||||
- 1500×800 → остается 1500×800, потом до 1500×1500 (с белым фоном сверху/снизу)
|
||||
|
||||
---
|
||||
|
||||
## Примеры создаваемых файлов
|
||||
|
||||
### После загрузки изображения "robot-50cm":
|
||||
|
||||
```
|
||||
products/
|
||||
├── originals/
|
||||
│ └── robot-50cm_1729611234567_original.jpg (JPEG, качество 100)
|
||||
├── large/
|
||||
│ └── robot-50cm_1729611234567_large.webp (WebP, качество 90)
|
||||
├── medium/
|
||||
│ └── robot-50cm_1729611234567_medium.webp (WebP, качество 85)
|
||||
└── thumbnails/
|
||||
└── robot-50cm_1729611234567_thumbnail.webp (WebP, качество 80)
|
||||
```
|
||||
|
||||
### Примеры генерируемых URL:
|
||||
|
||||
```
|
||||
/media/products/originals/robot-50cm_1729611234567_original.jpg
|
||||
/media/products/large/robot-50cm_1729611234567_large.webp
|
||||
/media/products/medium/robot-50cm_1729611234567_medium.webp
|
||||
/media/products/thumbnails/robot-50cm_1729611234567_thumbnail.webp
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Гибкость конфигурации
|
||||
|
||||
Теперь можно легко изменять параметры без изменения кода:
|
||||
|
||||
```python
|
||||
# Например, если нужно изменить качество large с 90 на 95:
|
||||
IMAGE_PROCESSING_CONFIG = {
|
||||
'formats': {
|
||||
'large': {
|
||||
'format': 'WEBP',
|
||||
'quality': 95, # ← измененное значение
|
||||
...
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
# Или если нужен PNG для оригинала:
|
||||
'original': {
|
||||
'format': 'PNG', # ← вместо JPEG
|
||||
'quality': 100,
|
||||
...
|
||||
}
|
||||
|
||||
# Или для WebP оригинала с качеством 95:
|
||||
'original': {
|
||||
'format': 'WEBP', # ← вместо JPEG
|
||||
'quality': 95,
|
||||
...
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Тестирование
|
||||
|
||||
Конфигурация успешно протестирована в Django shell:
|
||||
|
||||
```
|
||||
✓ IMAGE_PROCESSING_CONFIG loaded successfully!
|
||||
✓ All format configurations present
|
||||
✓ ImageService generates correct URLs with proper extensions
|
||||
✓ WebP files use correct extensions (.webp)
|
||||
✓ Original uses JPEG format (.jpg)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Преимущества решения
|
||||
|
||||
1. **Гибкость** - параметры хранятся в settings, легко менять
|
||||
2. **Масштабируемость** - можно добавлять новые размеры без изменения кода
|
||||
3. **Производительность** - WebP вместо JPEG для меньших размеров уменьшает размер файлов на 20-30%
|
||||
4. **Качество** - JPEG качество 100 для оригинала гарантирует максимальное качество
|
||||
5. **Читаемость** - квадратные изображения более универсальны для использования
|
||||
6. **Совместимость** - поддержка всех популярных форматов при загрузке
|
||||
|
||||
---
|
||||
|
||||
## Файлы измененные
|
||||
|
||||
1. **myproject/myproject/settings.py** - добавлена IMAGE_PROCESSING_CONFIG
|
||||
2. **myproject/products/utils/image_processor.py** - полностью переработан для динамической конфигурации
|
||||
3. **myproject/products/utils/image_service.py** - обновлен для работы с разными расширениями
|
||||
|
||||
---
|
||||
|
||||
## Заключение
|
||||
|
||||
Система обработки изображений успешно переведена на конфигурируемую архитектуру. Все параметры (размеры, форматы, качество) теперь находятся в settings.IMAGE_PROCESSING_CONFIG и могут быть легко изменены без дополнительных изменений кода.
|
||||
|
||||
**Статус:** ✓ **ГОТОВО К ИСПОЛЬЗОВАНИЮ**
|
||||
|
||||
Новые загружаемые изображения будут автоматически обрабатываться согласно новой конфигурации.
|
||||
Reference in New Issue
Block a user