Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные. Дагаев / Презентация_Проект_TGBot.pptx
Скачиваний:
1
Добавлен:
02.01.2026
Размер:
6.22 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" # стандартный компромисс для фото

Рис. 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