Files
octopus/IMAGE_CONFIGURATION_REPORT.md
Andrey Smakotin f12fd18190 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>
2025-10-22 23:34:14 +03:00

9.7 KiB
Raw Blame History

Отчет: Вынос конфигурации размеров и форматов изображений в settings

Резюме

Успешно вынесена конфигурация размеров, форматов и качества изображений из кода в settings.IMAGE_PROCESSING_CONFIG. Система теперь поддерживает разные форматы (JPEG для оригинала, WebP для других размеров) с динамическими параметрами качества.


Что было реализовано

1. ✓ Добавлена конфигурация в settings.py

Файл: myproject/myproject/settings.py:130-173

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

Гибкость конфигурации

Теперь можно легко изменять параметры без изменения кода:

# Например, если нужно изменить качество 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 и могут быть легко изменены без дополнительных изменений кода.

Статус:ГОТОВО К ИСПОЛЬЗОВАНИЮ

Новые загружаемые изображения будут автоматически обрабатываться согласно новой конфигурации.