- •Telegram-бот для сжатия изображений
- •Цели и задачи проекта: путь к автоматизации сжатия изображений
- •Актуальность проекта в цифровой эпохе
- •Выбор технологического стека для разработки бота
- •Модульная архитектура системы Telegram-бота
- •Основные этапы разработки системы
- •Цветовая модель и форматы данных
- •Детализация реализации Telegram-бота
- •Классификация изображений
- •Классификация изображений. Обзор работы
- •Алгоритм сжатия. JPEG
- •Алгоритм сжатия. JPEG. Обзор работы
- •Алгоритм сжатия для графики
- •Алгоритм медианного среза
- •Алгоритм Флойда-Штайнберга
- •Сборка PDF и работа с метаданными
- •Управление взаимодействием
- •Безопасность и надёжность системы
- •Инструкция пользователя. Сжатие
- •Инструкция пользователя. Сборка
- •Перспективы развития проекта
- •Выводы и применение проекта
Telegram-бот для сжатия изображений
В условиях стремительной цифровизации и роста объёма передаваемых медиа-данных возникает потребность в инструментах для оптимизации графического контента.
Цели и задачи проекта: путь к автоматизации сжатия изображений
Исследование возможностей
Изучить технологические возможности Telegram Bot API для максимального использования его потенциала.
Разработка архитектуры
Создать надёжную и масштабируемую архитектуру бота, учитывающую все функциональные требования.
Настройка клиента
Интегрировать и настроить работу с JSON для надёжного хранения пользовательских данных.
Тестирование и документация
Провести всестороннее тестирование, устранить ошибки и подготовить детальные инструкции для пользователей.
Основная цель проекта — создание полнофункционального Telegram-бота, который обеспечит автоматизированное сжатие изображений с дополнительными функциями, обработкой команд, соответствуя современным требованиям к удобству и эффективности.
Актуальность проекта в цифровой эпохе
Цифровизация
В условиях стремительной цифровизации и роста объёма передаваемых медиаданных возникает потребность в инструментах для оптимизации графического контента.
Оптимизация трафика
Оптимизация трафика и памяти — необходимость экономии мобильного трафика и места на устройствах. дистанционный контроль знаний незаменимым.
Конфиденциальность в цифровую эпоху
Конфиденциальность данных — важность удаления метаданных (геолокация, параметры съёмки) из изображений перед отправкой.
Платформа Telegram
Telegram с его открытым API, миллионами пользователей, поддержкой ботов и кроссплатформенностью идеально подходит для реализации такой системы.
Наш проект решает эти задачи, предоставляя инструмент для быстрой и интеллектуальной оптимизации изображений прямо в чате.
Выбор технологического стека для разработки бота
Язык программирования: Python
•Простой и читаемый синтаксис, ускоряющий разработку.
•Поддержка асинхронного программирования (asyncio) для высокой производительности.
•Обширное сообщество и огромное количество библиотек для любых задач.
•Универсальность и кроссплатформенность, обеспечивающие гибкость развёртывания.
Основной фреймворк: aiogram
• Асинхронный фреймворк, работающий на основе async/await для эффективной обработки запросов.
• Поддержка FSM (машины состояний) для управления
сложными сценариями взаимодействия.
• Удобная маршрутизация команд и событий, упрощающая разработку.
• Лёгкая интеграция с базами данных и внешними API.
Дополнительные инструменты
·img2pdf — для сборки изображений в PDF-документы.
·JSON — для хранения пользовательских настроек.
·dotenv — для управления конфигурацией.
Выбор Python и aiogram обусловлен их гибкостью, производительностью и обширной экосистемой, что позволяет создать надёжную и масштабируемую систему. Дополнительные инструменты обеспечивают полный цикл работы с данными, от хранения до анализа и визуализации.
Модульная архитектура системы Telegram-бота
1Модуль конфигурации Загрузка настроек и переменных окружения (токен бота, рабочий каталог).
2Модуль обработки изображений Ядро системы: сжатие, изменение размера,
конвертация форматов, классификация типа изображения.
3Модуль управления настройками Сохранение и загрузка персональных
параметров пользователей (качество, целевой размер и др.) в формате JSON.
4Модуль PDF-сессий
Временное хранение изображений в оперативной памяти для сборки многостраничных PDF-документов.
5 Модуль обработчиков команд |
|
Логика взаимодействия с пользователем через |
|
Telegram API (команды, загрузка файлов, |
|
ответы). |
Рис. 1 – Схема |
Основные этапы разработки системы
Процесс разработки был разбит на логические этапы, начиная от планирования функционала и заканчивая тестированием, что обеспечило методичный подход к созданию сложной системы.
1. Планирование функционала — определение ключевых функций: адаптивное сжатие, настройка параметров, сборка PDF, удаление EXIF-данных.
2. Проектирование архитектуры — разработка модульной структуры с чётким разделением ответственности.
3. Реализация логики сжатия — написание алгоритмов классификации изображений, бинарного Поиска качества, палитризации PNG.
4. Разработка пользовательского интерфейса — создание системы команд (/start, /quality, /pdf_start и др.) и обработчиков сообщений.
5.Интеграция и тестирование — объединение модулей, тестирование на различных типах изображений, обработка ошибок.
6.Оптимизация и документация — улучшение производительности, подготовка инструкции для пользователей.
Цветовая модель и форматы данных
В проекте используются четыре основных формата данных для хранения и передачи графической информации:
·JPEG — растровый формат для фотографий с сжатием с потерями, поддерживает до 24-битный цвет, но не прозрачность.
·PNG — растровый формат без потерь с поддержкой прозрачности и альфа-канала, подходит для графики и логотипов.
·PDF — универсальный формат документов, сохраняет текст, векторную и растровую графику, шрифты и макет для печати или просмотра.
·JSON — текстовый формат для структурированных данных в виде ключ- значение, используется для обмена данными в API и конфигурациях.
·RGB (Red, Green, Blue) представляет собой аддитивную цветовую модель, где каждый видимый цвет формируется путем сложения различных интенсивностей трех первичных цветов: красного, зеленого и синего.
Детализация реализации Telegram-бота
Реализация Telegram-бота является ядром системы. Была разработана модульная структура проекта, обеспечивающая чистоту кода, легкость отладки и возможность дальнейшего расширения функционала.
·Адаптивный алгоритм сжатия:
·Классификация: изображение анализируется на количество уникальных цветов и резкость краёв для определения типа («фото» или «графика»).
·Для фото: применяется JPEG-сжатие с настраиваемым качеством и прогрессивной развёрткой.
·Для графики: используется палитровый PNG с дизерингом Флойда-Штайнберга для сохранения чёткости контуров.
·Контроль размера: бинарный поиск по параметру качества для достижения заданного размера файла.
·Управление метаданными: опция удаления EXIF и ICC-данных для защиты приватности.
·Сборка PDF: последовательная загрузка изображений и объединение их в один PDF-документ.
Классификация изображений
При поступлении изображения, бот автоматически может определить к какому типу его отнести - «фотография» или «графика»·
Цель алгоритма состоит в том, чтобы выбрать оптимальный алгоритм сжатия:
· Фото (JPEG): Непрерывные тона, плавные градиенты.
· Графика (PNG): Четкие края, ограниченная цветовая палитра (скриншоты, схемы, текст).
Применяются два ключевых признака:
1. Статистика цвета: подсчет уникальных цветов на уменьшенной копии
(256x256). Меньше 20 000 цветов → признак графики.
2. Текстурный анализ: Применение фильтра обнаружения краев (FIND_EDGES на основе оператора Лапласиана) и вычисление средней яркости результата. Низкая средняя резкость (<40) → признак графики.
Классификация изображений. Обзор работы
Программная реализация классификации изображения на языке программирования Python. И пример работы бота с изображением пейзажа (рис. 2).
Цель алгоритма состоит в том, чтобы выбрать оптимальный алгоритм сжатия:
def classify_image(img: Image.Image) -> str: # 1. Уменьшаем и считаем цвета |
|
rgb_small = img.convert("RGB").resize((256, 256)) |
|
uniq = len(rgb_small.getcolors(maxcolors=1 << 20)) # 2. Анализируем резкость |
|
краев |
|
edges = rgb_small.filter(ImageFilter.FIND_EDGES).convert("L") |
|
edge_mean = sum(edges.getdata()) / (256 * 256) # 3. Комбинированное правило |
|
(эмпирические пороги) |
|
if uniq < 20000 and edge_mean < 40: |
|
return "graphics" # -> Будеи сжимать в PNG |
|
return "photo" |
# -> Будеи сжимать в JPEG |
imageFilter.FIND_EDGES — это фильтр из модуля ImageFilter библиотеки |
Рис. 2 – Пример работы по сжатию |
|
|
Pillow, который выявляет и подчёркивает края объектов на изображении. |
|
Применяет свёртку, обнаруживающую резкие изменения яркости между |
|
соседними пикселями. |
|
