- •Telegram-бот для сжатия изображений
- •Цели и задачи проекта: путь к автоматизации сжатия изображений
- •Актуальность проекта в цифровой эпохе
- •Выбор технологического стека для разработки бота
- •Модульная архитектура системы Telegram-бота
- •Основные этапы разработки системы
- •Цветовая модель и форматы данных
- •Детализация реализации Telegram-бота
- •Классификация изображений
- •Классификация изображений. Обзор работы
- •Алгоритм сжатия. JPEG
- •Алгоритм сжатия. JPEG. Обзор работы
- •Алгоритм сжатия для графики
- •Алгоритм медианного среза
- •Алгоритм Флойда-Штайнберга
- •Сборка PDF и работа с метаданными
- •Управление взаимодействием
- •Безопасность и надёжность системы
- •Инструкция пользователя. Сжатие
- •Инструкция пользователя. Сборка
- •Перспективы развития проекта
- •Выводы и применение проекта
Алгоритм сжатия. JPEG
Алгоритм использует особенности человеческого зрения (меньшая чувствительность к цвету и мелким деталям) для избирательного удаления наименее заметной информации.
·Основные этапы сжатия:
1.YCbCr: Преобразование из RGB в цветовое пространство, разделяющее яркость (Y) и цветность (Cb, Cr).
2.Субдискретизация (4:2:0): Уменьшение разрешения цветовых каналов в 2 раза. Первое сильное сжатие почти без видимой потери качества.
3.Дискретное косинусное преобразование (ДКП): Разбиение изображения на блоки 8x8 и перевод из пространственной области в частотную (от общего тона к мелким деталям).
4.Квантование: Деление частотных коэффициентов на специальную таблицу и округление. Высокочастотные коэффициенты (детали) часто обнуляются. Степень сжатия управляется параметром качества (1-95).
Алгоритм сжатия. JPEG. Обзор работы
Адаптивный алгоритм в Telegram-боте
·Использование библиотеки Pillow: Весь конвейер JPEG инкапсулирован в одном вызове img.save() с ключевыми параметрами:
·quality=85 – уровень сжатия (1-95).
·progressive=True – прогрессивная загрузка (лучше для сети и часто компактнее).
·subsampling="4:2:0" – стандартная схема для фото.
·Умное управление размером – бинарный поиск: Если пользователь задал целевой размер (например, 300 КБ), бот итеративно подбирает параметр качества.
def _save_jpeg_bytes(img: Image.Image, quality: int) -> bytes: buf = io.BytesIO()
img.save(
buf,
format="JPEG",
quality=max(1, min(95, quality)), optimize=True,
progressive=True, # лучше для «проявки» и часто компактнее subsampling="4:2:0" # стандартный компромисс для фото
Рис. 3 – Пример работы по сжатию. JPEG
)
return buf.getvalue()
Алгоритм сжатия для графики
Сжатие без потерь для изображений с малым числом цветов
Проблема полноцветного PNG состоит в том, что формат хранит 24 бита (16.7 млн цветов) на каждый пиксель, даже если на картинке всего 10 цветов.
Решение — палитровый PNG (PNG-P):
· Палитра (PLTE): Массив до 256 цветов, выбранных из изображения (алгоритм медианного среза).
· Индексная карта: каждый пиксель заменяется индексом (от 0 до 255), указывающим на цвет в палитре. Это резко уменьшает объем данных.
· Проблема палитризации отражается в резких цветовых переходах, «полосах» на градиентах.
· Решение — дизеринг (Флойда-Штайнберга): ошибка разницы между исходным и палитровым цветом распределяется между соседними пикселями. Глаз усредняет, видя плавный переход.
Алгоритм медианного среза
Алгоритм решает проблему уменьшения тысячи цветов до 256 без |
|
потери качества. Необходимо преобразовать полноцветное RGB- |
|
изображение (16.7 млн цветов) в изображение с ограниченной палитрой |
|
(например, 128 цветов), минимизируя визуальную разницу. |
|
· Алгоритм медианного среза (Median Cut): |
|
1. Исходный "цветовой куб": Все пиксели изображения |
|
рассматриваются как точки в трехмерном RGB-пространстве. |
Рис. 4 – Цветовой куб |
2. Рекурсивное разбиение: куб последовательно делится пополам. |
|
· На каждом шаге выбирается цветовой канал (R, G или B) с |
|
наибольшим разбросом значений. |
|
· Пиксели сортируются по этому каналу, и куб делится по медиане — |
|
так, чтобы в каждой части оказалось примерно равное количество |
|
пикселей. |
|
3. Формирование палитры: Процесс повторяется до получения нужного |
|
количества блоков (например, 128). Средний цвет каждого блока |
|
становится цветом в итоговой палитре. |
|
Алгоритм Флойда-Штайнберга
Необходимо оптимизировать палитризацию и сохранить плавность |
|
|
переходов. Для решения проблемы полос применяется дизеринг |
|
|
(диффузия ошибки): |
|
|
· Принцип заключается в следующем: ошибка разницы между |
|
|
исходным цветом пикселя и ближайшим цветом в палитре |
|
|
распределяется на соседние, не обработанные пиксели. |
|
|
· Алгоритм Флойда-Штайнберга: использует фиксированную матрицу |
|
|
для распространения ошибки (например, 7/16 — направо, 3/16 — вниз- |
|
|
влево и т.д.). |
|
|
· Результат: соседние пиксели слегка "подкрашиваются", создавая |
|
|
иллюзию промежуточных цветов. Глаз усредняет, воспринимая |
|
|
плавный градиент. |
|
|
· Реализация в проекте (с помощью Pillow): |
Рис. 5 – Пример сжатия изображения схемы |
|
# Палитризация с адаптивной палитрой и дизерингом |
|
|
pimg = img.convert("P", |
|
|
palette=Image.ADAPTIVE, # Используется медианный срез |
|
|
colors=128, |
# Настраиваемая глубина палитры |
|
dither=Image.FLOYDSTEINBERG) # Включение дизеринга |
|
|
Сборка PDF и работа с метаданными
Сборка многостраничного PDF:
· Механизм сессий: Пользователь начинает сессию (/pdf_start), отправляет изображения по порядку, завершает (/pdf_done).
· Техническая реализация: Изображения конвертируются в JPEG (для унификации), затем библиотека img2pdf создает PDF, где каждая картинка — отдельная страница.
· Результат: Удобный способ создать документ, инструкцию или портфолио прямо в Telegram (рис. 6).
Удаление метаданных (EXIF/ICC):
· Что такое EXIF? Скрытые данные в изображении: геолокация, дата съемки, модель камеры, настройки.
· Зачем удалять? Конфиденциальность (не передавать координаты) + Уменьшение размера файла.
· Как работает: По команде /strip_exif on бот удаляет блоки exif и icc_profile из файла перед сжатием (рис. 7).
Рис. 6 – Пример работы с метаданными |
Рис. 7 – Пример сборки PDF |
|
Управление взаимодействием
Эффективное взаимодействие с пользователем достигается за счет концепции Машины состояний (FSM). FSM обеспечивает строгую последовательность шагов, предотвращая некорректные действия и направляя пользователя по заданному сценарию.
Начало взаимодействия (/start)
При активации бота командой /start система переходит в состояние ожидания дальнейших команд.
Выбор команды
Система подтверждает активацию и отправляет баннер-приветствие, и предлагает перейти к выбору команды.
Работа клиента
Пользователь вводит нужную ему команду и дальше отсылает изображение, с которым будет работать система.
Работа с изображением
В состоянии работы бот отправляет уведомление о начале работы, и начинает внутреннюю обработку изображения по заданной инструкции.
Завершение
После обработки изображения бот отправляет в ответ файл с изображением. Если включена опция удаления мета-данных, бот удаляет данные о месте съемки (и прочие) для повышения конфиденциальности.
Безопасность и надёжность системы
Настройки в JSON |
Мета-данные |
Валидация данных |
· Локальное |
· Удаление |
· Обработка ошибок |
хранение настроек |
метаданных — |
— комплексная |
— данные |
функция strip_exif |
валидация входных |
пользователей |
позволяет удалять |
данных и файлов с |
хранятся |
конфиденциальную |
понятными |
изолированно в |
информацию из |
уведомлениями для |
отдельных JSON- |
изображений. |
пользователя. |
файлах. |
|
|
Интеграция с Redis
Возможна интеграция с Redis для эффективного кэширования сессий, что значительно повысит производительность и масштабируемость системы при высокой нагрузке.
Система разработана с акцентом на устойчивость к сбоям и масштабируемость. Доступ к данным строго ограничен только администратором, что обеспечивает дополнительный уровень безопасности и контроля. Эти меры гарантируют, что бот будет функционировать надёжно и защищённо в любых условиях эксплуатации.
Инструкция пользователя. Сжатие
Цель: уменьшить размер фотографии для отправки в чат или экономии места 1. Начать диалог: Найдите бота в Telegram и отправьте команду /start.
2. Настроить качество: Отправьте /quality 85 (где 85 — желаемое качество от 1 до 95).
3. Возможно, задать лимит размера: Отправьте /target 500, чтобы файл не превышал 500 КБ.
4. Отправить фото: Просто перетащите или выберите изображение.
Рис. 8 – Приветствие при начале работы
5. Получить результат: Через несколько секунд бот пришлет сжатое изображение как файл.
Рис. 9 – Сжатие изображения
Инструкция пользователя. Сборка
Цель: объединить несколько скриншотов или фотографий в один PDF-файл.
1. Начать сессию PDF: Отправьте команду /pdf_start. Бот перейдет в режим сборки.
2. Отправлять изображения по порядку: Отправляйте все нужные картинки одну за другой. Бот будет подтверждать добавление каждой.
3. Завершить и создать PDF: Когда все изображения отправлены, введите команду /pdf_done.
4. Получить PDF: Бот обработает все добавленные изображения и отправит вам готовый PDF-документ. Сессия автоматически завершится.
Пример последовательности:
/pdf_start→ [Отправляете image1.jpg] → [Отправляете image2.png]
→ [Отправляете image3.jpg] → /pdf_done → [Получаете файл photos_abc123.pdf].
Рис. 10 – Сборка PDF
