- •Проектная работа
- •Глава 1. Технологии разработки Telegram бота. 4
- •Глава 2. Разработка Telegram-бота 21
- •Перечень терминов и сокращений
- •Введение
- •Глава 1. Технологии разработки Telegram бота.
- •Обзор литературы
- •1.2 История мессенджера Telegram
- •1.3 Сравнительный анализ языков программирования для Telegram-ботов
- •1.4 Характеристика языка программирования Python
- •1.5 Обзор фреймворков и библиотек для создания ботов
- •1.6 Обзор библиотек и методов обработки изображений
- •1.7 Описание алгоритмов и форматов данных
- •1.7.1. Цветовые модели и форматы данных
- •1.7.2 Алгоритм палитризации
- •1.7.3 Алгоритм классификации изображений
- •1.7.4 Алгоритм сжатия jpeg
- •1.7.5 Алгоритм сжатия png
- •Глава 2. Разработка Telegram-бота
- •2.1 Планируемые возможности бота и подходы к их реализации
- •2.2 Разработка модуля обработки изображений
- •2.3 Разработка пользовательского интерфейса
- •2.4 Разработка функций для работы с изображениями и передачи данных
- •2.4.1 Импорты, настройки и словари
- •2.4.2 Пользовательские настройки
- •2.4.3 Функции обработки изображений
- •2.4.4 Функции работы с пользовательскими данными
- •2.4.6 Обработчики команд и сообщений
- •2.4.7 Основной цикл
- •2.5 Описание разработки Telegram-бота
- •2.6 Инструкция пользователя
- •Список литературы
- •Приложение
1.7.4 Алгоритм сжатия jpeg
Алгоритм сжатия JPEG работает, опираясь на то, как устроено человеческое зрение: глаза лучше замечают изменения в яркости, чем в цвете, и не видит мелкие детали на расстоянии. Всё это позволяет убрать ненужную информацию без сильной потери качества.
Сначала картинку в цветах RGB (красный, зелёный, синий) превращают в YCbCr. Здесь Y обозначает яркость — насколько пиксель светлый или тёмный, а Cb (или Pb) показывает разницу в синем направлении, то есть насколько цвет отклоняется от нейтрального серого в сторону голубого или жёлтого. Cr (или Pr) отвечает за красное направление — отклонение в сторону красного или зелёного.
Y = 0.299R + 0.587G + 0.114B
Дальше идёт субдискретизация 4:2:0. Глаз хуже видит быстрые смены цвета, чем яркости, поэтому яркость Y оставляют полной, а цвета Cb и Cr уменьшают вдвое по ширине и высоте. Для группы из 4 пикселей вместо 12 значений (по 4 на каждый канал) остаётся 6 — это сжатие в 2 раза, и разница почти незаметна.
Затем применяется дискретное косинусное преобразование (ДКП) для блоков 8x8 пикселей. Оно разбивает кусочек картинки на "волны" разных частот: низкие частоты — это общая яркость и большие формы, высокие — мелкие детали вроде текстур. Формула ДКП берёт каждый пиксель, умножает на косинусы и суммирует — в итоге центральный коэффициент показывает среднюю яркость блока, а остальные описывают детали. Высокие частоты слабее, их легче убрать.
Квантование — главный шаг сжатия: каждый коэффициент из ДКП делят на число из специальной таблицы квантования и округляют. Для мелких деталей (высокие частоты) числа в таблице большие, так что коэффициенты становятся нулями и исчезают. Это потеря информации, но глаз её не замечает. Таблица подстраивается под качество: чем выше, тем меньше потери.
Реализация в проекте: библиотека Pillow инкапсулирует всю эту сложную цепочку преобразований. Параметр quality (1-95) масштабирует стандартные матрицы квантования, обеспечивая линейный контроль степени сжатия.
1.7.5 Алгоритм сжатия png
Алгоритм сжатия PNG представляет собой последовательный алгоритм. В котором сначала идёт предварительная фильтрация для каждой строки пикселей. Выбирается один из пяти фильтров, чтобы данные стали проще для сжатия. Например, фильтр "None" просто оставляет всё как есть. "Sub" вычитает из текущего пикселя значение левого соседа. "Up" — значение пикселя сверху. "Average" берёт среднее от левого и верхнего. А самый умный "Paeth" предсказывает значение по трём соседям (левому, верхнему и левому-сверху), выбирая ближайший по расстоянию. Это как предугадывание: если пиксели похожи, разница становится маленькой и легко сжимается.
Дальше работает алгоритм Deflate — сочетание алгоритмов LZ77 и Хаффмана.
LZ77 — это классический алгоритм сжатия данных без потерь из семейства Lempel–Ziv, предложенный Лемпелем и Зивом в 1977 году. Алгоритм заменяет повторяющиеся подстроки в потоке данных на ссылки на предыдущие вхождения (позиция + длина совпадения).
LZ77 ищет повторяющиеся кусочки в окне до 32 килобайт, заменяя их указанием "отступ назад на столько-то байт, взять столько-то". PNG использует "ленивый" поиск, чтобы найти не первое попавшееся совпадение, а самое выгодное. Затем динамический Хаффман строит кодовое дерево по реальным частотам символов в данных — частые значения получают короткие коды, редкие длинные.
Для палитровых PNG (с малым числом цветов) сначала строят палитру методом медианного среза: цветовой куб RGB делят пополам по каналу с большим разбросом, сортируют пиксели, берут середину и повторяют, пока не выйдет нужное число цветов. Каждый кусок заменяют средним цветом из него.
Если нужно сгладить переходы, применяют дизеринг Флойда-Штайнберга. Когда пиксель переводят в ближайший из палитры, ошибка цвета распределяется по соседям: правому — 7/16, нижнему левому — 3/16, нижнему — 5/16, нижнему правому — 1/16. Это создаёт иллюзию промежуточных цветов, потому что глаз усредняет их сам.
В библиотеке Pillow всё это работает автоматически: она подбирает лучшие фильтры и параметры, балансируя скорость и размер файла.
