Лабораторные. Дагаев / Презентация_Проект_TGBot
.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" # стандартный компромисс для фото
return buf.getvalue()
Рис. 3 – Пример работы по сжатию. JPEG
Алгоритм сжатия для графики
Сжатие без потерь для изображений с малым числом цветов
Проблема полноцветного 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): |
|
|
# Палитризация с адаптивной палитрой и дизерингом |
|
|
pimg = img.convert("P", |
|
Рис. 5 – Пример сжатия изображения схемы |
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
