libjpeg — это бесплатная библиотека с функциями для обработки формата данных изображений JPEG . Она реализует кодек JPEG (кодирование и декодирование) вместе с различными утилитами для обработки данных JPEG. Она написана на языке C и распространяется как свободное программное обеспечение вместе с исходным кодом на условиях пользовательской разрешительной ( BSD -подобной) лицензии свободного программного обеспечения, которая требует указания авторства . Оригинальный вариант поддерживается и публикуется Independent JPEG Group (IJG). Между тем, существует несколько форков с дополнительными функциями.
Изображения JPEG JFIF широко используются в Интернете. Степень сжатия можно регулировать для достижения желаемого компромисса между размером файла и визуальным качеством. [4]
Вместе с libjpeg поставляются следующие служебные программы:
Программа командной строки jpegtran предоставляет несколько функций для переформатирования и перекодирования представления коэффициентов DCT , для преобразования фактических данных изображения и для удаления вспомогательных данных в файлах JPEG, соответственно. Преобразования , касающиеся представления коэффициентов, включают:
Эти преобразования полностью без потерь и обратимы. Преобразования данных изображения включают:
Они не имеют потерь и обратимы только в отношении данных изображения, которые сохраняются. Перекодирование с повторным квантованием с потерями данных изображения ( потеря генерации ) не происходит.
Реализация JPEG от Independent JPEG Group (IJG) была впервые публично представлена 7 октября 1991 года и с тех пор значительно усовершенствовалась. Первоначально разработка велась в основном Томом Лейном . Реализация IJG с открытым исходным кодом была одним из основных пакетов с открытым исходным кодом и имела ключевое значение для успеха стандарта JPEG. Многие компании включили его в различные продукты, такие как редакторы изображений и веб-браузеры. [9]
Для версии 5, которая была выпущена 24 сентября 1994 года, вся кодовая база была переписана. Она представила служебные программы rdjpgcom и wrjpgcom для обработки встроенных текстовых комментариев. Версия 6 от 2 августа 1995 года поставлялась с поддержкой прогрессивного JPEG и впервые с служебной программой jpegtran . Эта утилита была расширена функциями поворота и переворота изображений и снижения градаций серого в версии 6b.
Из версии 6b libjpeg от 27 марта 1998 года Миясака Масару создал ветвь под названием libjpeg/SIMD , которая включала оптимизации x86 SIMD. Она получила существенный вклад от проектов TigerVNC и VirtualGL в 2009 году. На этой основе в 2010 году был создан проект libjpeg-turbo. [10]
4 марта 2014 года была опубликована первая версия форка MozJPEG , оптимизирующего размер файла . Для этой версии Джош Аас из Mozilla Research переработал Perl -скрипт jpegcrush от главного разработчика x264 Лорена Мерритта и интегрировал его в кодовую базу libjpeg-turbo. [11]
10 июля 2014 года Mozilla выпустила версию 2.0, в которой в основном была добавлена решетчатая квантизация, а также теперь она может уменьшать размер базовых JPEG-файлов. Facebook , Inc. пожертвовал60 000 долларов на разработку следующей версии, [12] и CloudFlare назначил разработчика для улучшения MozJPEG. [13]
В 2019 году libjpeg-turbo стала одобренной ISO и ITU эталонной реализацией формата JPEG. [14]
В апреле 2024 года Google представила Jpegli — новую библиотеку кодирования JPEG, которая предлагает расширенные возможности и улучшение коэффициента сжатия на 35% при высоких настройках сжатия, при этом скорость кодирования сопоставима с MozJPEG. [15]
После 11 лет и смены руководства IJG под руководством Гвидо Фолльбединга выпустила новые версии libjpeg (с 7 по 9), каждая из которых нарушала совместимость ABI с предыдущими версиями. [16] Изменения, которые ожидались после серии 6x, не были реализованы. [17]
В версии 7 была введена поддержка арифметического кодирования , которая ранее была отклонена из-за патентной ситуации, а также функция кадрирования в jpegtran ( -crop
). [17]
Версии 8 и 9 в основном служили для введения спорных [18] несовместимых расширений формата. Они широко рассматриваются как неэффективные и уступающие существующим стандартизированным решениям. [19] [20] Их стандартизация была отклонена после представления в ITU-T . Первоначальный организатор Том Лейн и другие критикуют эти изменения как отход от целей IJG. [18]
Известными ответвлениями являются libjpeg-turbo, который оптимизирует скорость выполнения, и MozJPEG, который оптимизирует меньшие размеры файлов.
Существует также библиотека с похожим названием от ISO , которая стремится стать полной реализацией стандартов JPEG, JPEG XT и JPEG-LS . [26]
libjpeg-turbo — это ответвление libjpeg, которое использует инструкции SIMD для ускорения базового кодирования и декодирования JPEG. Многие проекты теперь используют libjpeg-turbo вместо libjpeg, включая популярные дистрибутивы Linux ( Fedora , Debian , Mageia , openSUSE , ...), Mozilla и Chrome . [28] [29] [30] Помимо производительности, некоторые проекты решили использовать libjpeg-turbo, потому что это позволяет им сохранить обратную совместимость ABI со старым выпуском libjpeg v6b. [31] libjpeg v7, v8 и v9 нарушили совместимость ABI с предыдущими выпусками. [16]
libjpeg-turbo реализует стандартное арифметическое кодирование и функции кадрирования без потерь, представленные в libjpeg v7. Его также можно настроить на совместимость с libjpeg v7 или v8 ABI, но он реализует масштабирование DCT и фирменный SmartScale, который основан на масштабировании DCT. [32] libjpeg-turbo решает не поддерживать SmartScale, поскольку он не является стандартом ITU-T и поскольку их собственные исследования показывают, что он (и масштабирование DCT) неэффективен. [22] В более широком смысле, поскольку единственная важная новая функция в libjpeg v9 специфична для формата SmartScale, проект libjpeg-turbo решил отказаться от эмуляции libjpeg v9. [19]
С 2019 года libjpeg-turbo является одной из двух эталонных реализаций JPEG, доступных как ISO/IEC 10918-7 и ITU-T T.873. [14] Другая эталонная реализация — ISO libjpeg, которая также включает поддержку JPEG XT и JPEG LS.
MozJPEG — это ответвление libjpeg-turbo, созданное Джошем Аасом и другими из Mozilla Research. Его цель — ускорить время загрузки веб-страниц за счет уменьшения размера файла (примерно на 10%) и, следовательно, времени передачи за счет повышения эффективности кодирования при сохранении качества изображения. Для этого он использует больше вычислительной мощности для кодирования (асимметрии), сохраняя полную совместимость со стандартом JPEG и не требуя никаких изменений на стороне декодера.
Методы, которые MozJPEG использует для достижения высокого сжатия, включают оптимизацию деревьев Хаффмана , использование прогрессивного кодирования для оптимального разделения спектра коэффициентов DCT на отдельные сканы и использование решетчатого квантования . Кроме того, предустановки агрессивно настроены на минимизацию размеров файлов.
Помимо libjpeg-turbo, MozJPEG также основан на jpegcrush, скрипте Perl Лорена Мерритта. [11] [34]
В апреле 2024 года Google представила Jpegli — новую библиотеку кодирования JPEG, которая предлагает расширенные возможности и улучшение коэффициента сжатия на 35% при высоких настройках сжатия, при этом скорость кодирования сопоставима с MozJPEG. [35]
ISO/IEC Joint Photography Experts Group поддерживает реализацию эталонного программного обеспечения для базового JPEG (ISO/IEC 10918-1 и 18477-1) и расширений JPEG XT (ISO/IEC 18477 части 2 и 6-9), а также без потерь JPEG-LS (ISO/IEC 14495). [36] Он также включает некоторые оптимизации MozJPEG. Хотя он также называется libjpeg, он не связан с исходным кодом, предоставленным Independent JPEG Group (IJG), и не поддерживает фирменные расширения, представленные IJG с 2007 года.
Единственное беспокойство вызывало то, что Гвидо Фолльбединг вряд ли подписан на этот список, а IJG JPEG по сути разрабатывается одним человеком.