Слайд 8
Реализация бота является ядром всей системы. Мы разработали адаптивный алгоритм сжатия, который начинается с классификации изображения на тип «фото» или «графика». Для фото применяется JPEG-сжатие с настраиваемым качеством и прогрессивной развёрткой, а для графики — палитровый PNG с дизерингом Флойда-Штайнберга. Также реализован контроль размера файла через бинарный поиск по параметру качества, что позволяет точно достигать заданного пользователем размера. Дополнительно бот поддерживает удаление метаданных (EXIF и ICC) для защиты приватности и сборку PDF из нескольких изображений.
Слайд 9
Классификация изображений — это важный этап, который определяет, какой алгоритм сжатия будет применён. Наш бот анализирует два ключевых признака: статистику цвета и текстурные характеристики. Сначала изображение уменьшается до размера 256x256 пикселей, и подсчитывается количество уникальных цветов. Если их меньше 20 000, это признак графики. Затем применяется фильтр обнаружения краёв на основе оператора Лапласиана, и вычисляется средняя яркость результата. Низкая резкость (менее 40) также указывает на графику. На основе этих данных бот выбирает оптимальный формат сжатия: JPEG для фото и PNG для графики.
Слайд 10
Алгоритм сжатия JPEG основан на особенностях человеческого зрения, которое менее чувствительно к цветовым изменениям и мелким деталям. Процесс сжатия включает несколько этапов: сначала изображение преобразуется из RGB в цветовое пространство YcbCr, где разделяется яркость (Y) и цветность (Cb, Cr). Затем применяется субдискретизация 4:2:0, которая уменьшает разрешение цветовых каналов вдвое, что значительно сокращает объём данных почти без видимой потери качества. Далее выполняется дискретное косинусное преобразование (ДКП), разбивающее изображение на блоки 8x8 и переводящее их в частотную область. На этапе квантования коэффициенты делятся на специальную таблицу, причём высокочастотные коэффициенты часто обнуляются, что и обеспечивает сжатие.
Слайд 11
В нашем проекте JPEG-сжатие реализовано с использованием библиотеки Pillow, которая инкапсулирует весь конвейер обработки в одном вызове метода img.save(). Ключевые параметры включают качество (от 1 до 95), прогрессивную загрузку для лучшего отображения в сети и субдискретизацию 4:2:0. Для точного контроля размера файла реализован алгоритм бинарного поиска: если пользователь задаёт целевой размер, бот итеративно подбирает параметр качества, чтобы результат не превышал указанное значение. Это обеспечивает гибкость и точность в управлении выходным файлом.
Слайд 12
Для графических изображений, таких как скриншоты, схемы или логотипы, мы используем сжатие без потерь в формате PNG. Однако полноцветный PNG может быть избыточным, если изображение содержит мало цветов. Поэтому мы применяем палитровый PNG (PNG-P), который использует палитру до 256 цветов, созданную с помощью алгоритма медианного среза. Каждый пиксель заменяется индексом в этой палитре, что значительно уменьшает объём данных. Для сохранения плавности переходов и избежания резких цветовых границ используется дизеринг Флойда-Штайнберга, который распределяет ошибку квантования между соседними пикселями, создавая иллюзию плавных градиентов.
