libjpeg
Широко используемая библиотека для работы с изображениями в формате JPEG (Joint Photographic Experts Group). Она предоставляет функции для чтения, записи, сжатия и декомпрессии изображений в формате JPEG, а также для выполнения различных операций преобразования изображений. Библиотека известна своей надежностью, производительностью и совместимостью с множеством приложений.
Особенности
- поддержка чтения и записи файлов в формате JPEG (базовый, прогрессивный, с потерями и без потерь);
- настраиваемые параметры сжатия (качество, субдискретизация, прогрессивный режим);
- возможность работы с различными цветовыми пространствами (YCbCr, RGB, grayscale);
- высокая производительность благодаря оптимизированным алгоритмам.
Основные компоненты
libjpeg предоставляет набор функций и структур данных для работы с JPEG-изображениями на низком и высоком уровнях (подробнее с документацией можно ознакомиться здесь).
Управление сжатием и декомпрессией
Библиотека использует объекты-представления для управления процессом сжатия (compression) и декомпрессии (decompression). Эти объекты хранят состояние и параметры, необходимые для обработки JPEG-данных.
Основные объекты и функции:
jpeg_compress_structиjpeg_decompress_struct— основные структуры для сжатия и декомпрессии;jpeg_create_compress()иjpeg_create_decompress()— инициализация структур;jpeg_destroy_compress()иjpeg_destroy_decompress()— освобождение ресурсов;jpeg_stdio_dest()иjpeg_stdio_src()— указание источника/приемника данных (файл);jpeg_mem_dest()иjpeg_mem_src()— работа с памятью как источником/приемником.
Чтение и запись JPEG-файлов
Библиотека предоставляет функции для чтения заголовков JPEG, декомпрессии данных изображения, а также для настройки параметров сжатия и записи изображений в формате JPEG.
Функции чтения и записи:
jpeg_read_header()— чтение заголовка JPEG-файла (без декомпрессии данных);jpeg_start_decompress()— начало процесса декомпрессии;jpeg_read_scanlines()— чтение данных изображения построчно;jpeg_start_compress()— начало процесса сжатия;jpeg_write_scanlines()— запись данных изображения построчно;jpeg_finish_decompress()иjpeg_finish_compress()— завершение процессов.
Управление параметрами сжатия
libjpeg позволяет тонко настраивать параметры сжатия для достижения баланса между качеством изображения и размером файла. Это включает настройку качества, субдискретизации цветовых компонент и других параметров.
Основные параметры сжатия:
jpeg_set_quality()— установка уровня качества (от 0 до 100);jpeg_set_colorspace()— выбор цветового пространства (JCS_RGB, JCS_GRAYSCALE, JCS_YCbCr);- Управление субдискретизацией (через
jpeg_set_defaults()иjpeg_default_colorspace); - Выбор типа сжатия (базовый, прогрессивный) через
jpeg_simple_progression()иjpeg_suppress_tables().
Обработка ошибок и восстановление
Библиотека включает механизмы обработки ошибок, которые позволяют приложениям корректно реагировать на проблемы при чтении или записи JPEG-файлов. Также поддерживается ограниченное восстановление после ошибок.
Функции обработки ошибок:
- Установка пользовательского обработчика ошибок через
jpeg_error_mgr; jpeg_abort()— аварийное прерывание обработки;jpeg_resync_to_restart()— попытка восстановления после ошибки в потоке данных;- Режим "warning" для некритичных проблем.
Преобразование изображений
libjpeg предоставляет встроенные возможности для преобразования изображений во время декомпрессии, такие как изменение размера, обрезка и преобразование цветового пространства.
Функции преобразования:
jpeg_crop_scanline()— обрезка изображения по горизонтали;jpeg_skip_scanlines()— пропуск строк (для быстрого масштабирования);- Масштабирование во время декомпрессии через
jpeg_scale_numиjpeg_scale_denom; - Автоматическое преобразование цветового пространства (например, YCbCr в RGB).
Интеграция с другими библиотеками
libjpeg часто используется в сочетании с другими библиотеками обработки изображений, такими как libpng, libtiff, и графическими интерфейсами, такими как GTK, Qt.
Точки интеграции:
- Использование в графических редакторах (GIMP, Photoshop) и просмотрщиках изображений;
- Интеграция с веб-серверами для динамической обработки изображений;
- Использование в мобильных приложениях для загрузки и сохранения изображений;
- Поддержка в языках программирования через обертки (Python, Java, Perl и др.).