Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лабораторные. Дагаев / Презентация_Проект_TGBot

.pdf
Скачиваний:
1
Добавлен:
02.01.2026
Размер:
1.05 Mб
Скачать

Алгоритм сжатия. 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