libjpeg — бесплатная библиотека с функциями для работы с форматом данных изображений JPEG . Он реализует кодек JPEG (кодирование и декодирование) наряду с различными утилитами для обработки данных JPEG. Он написан на языке C и распространяется как свободное программное обеспечение вместе со своим исходным кодом на условиях специальной разрешающей ( BSD- подобной) лицензии свободного программного обеспечения, требующей указания авторства . Исходный вариант поддерживается и публикуется Independent JPEG Group (IJG). Между тем, существует несколько форков с дополнительными функциями.
Изображения JPEG JFIF широко используются в Интернете. Степень сжатия можно регулировать для достижения желаемого компромисса между размером файла и качеством изображения. [4]
Вместе с libjpeg поставляются следующие служебные программы:
Программа командной строки jpegtran предоставляет несколько функций для переформатирования и перекодирования представления коэффициентов DCT , для преобразования фактических данных изображения и для удаления вспомогательных данных в файлах JPEG соответственно. Преобразования, касающиеся представления коэффициентов, включают в себя:
Каждое из этих преобразований происходит без потерь и обратимо. Преобразования данных изображения включают в себя:
Они выполняются без потерь и обратимы только в отношении сохраняемых данных изображения. Перекодирование с повторным квантованием данных изображения с потерями ( потеря генерации ) не происходит.
Существует связанное приложение Windows, Jpegcrop, которое предоставляет пользовательский интерфейс для jpegtran . Для Unix-подобных систем, таких как Linux, существует бесплатный CropGUI с аналогичной функциональностью. Дополнительные программы, поддерживающие функции преобразования JPEG без потерь на основе кода IJG, приведены в списке приложений без потерь.
Реализация 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 , которая включала оптимизацию SIMD x86. В 2009 году он получил существенный вклад от проектов TigerVNC и VirtualGL. На этой основе в 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]
После 11 лет и смены руководства IJG под руководством Гвидо Волльбединга выпустила новые версии libjpeg (с 7 по 9), каждая из которых нарушала совместимость ABI с предыдущими версиями. [15] Изменения, которые ожидались после серии 6x, не были реализованы. [16]
В версии 7 была введена поддержка арифметического кодирования , которая ранее была отклонена из-за патентной ситуации, а также функция обрезки в jpegtran ( -crop
). [16]
Версии 8 и 9 в основном служили для введения спорных [17] несовместимых расширений формата. Многие считают их неэффективными и уступающими существующим стандартизированным решениям. [18] [19] Их стандартизация была отклонена после подачи в ITU-T . Первоначальный организатор Том Лейн и другие критикуют эти изменения как отход от целей IJG. [17]
Хорошо известны форки libjpeg-turbo, оптимизирующие скорость выполнения, и mozjpeg, оптимизирующие файлы меньшего размера.
Существует также библиотека с аналогичным названием от ISO , целью которой является полная реализация стандартов JPEG, JPEG XT и JPEG-LS . [25]
libjpeg-turbo — это ответвление libjpeg, которое использует инструкции SIMD для ускорения базового кодирования и декодирования JPEG. Многие проекты теперь используют libjpeg-turbo вместо libjpeg, включая популярные дистрибутивы Linux ( Fedora , Debian , Mageia , openSUSE , ...), Mozilla и Chrome . [26] [27] [28] Помимо производительности, некоторые проекты решили использовать libjpeg-turbo, поскольку это позволяет им сохранить обратную совместимость ABI со старой версией libjpeg v6b. [29] libjpeg v7, v8 и v9 нарушили совместимость ABI с предыдущими выпусками. [15]
libjpeg-turbo реализует совместимое со стандартами арифметическое кодирование и функции обрезки без потерь, представленные в libjpeg v7. Его также можно настроить для совместимости с ABI libjpeg v7 или v8, но он реализует масштабирование DCT и собственную технологию SmartScale, основанную на масштабировании DCT. [30] libjpeg-turbo предпочитает не поддерживать SmartScale, поскольку он не является стандартом ITU-T и потому что их собственные исследования считают его (и масштабирование DCT) неэффективным. [21] В более широком смысле, поскольку единственная важная новая функция в libjpeg v9 специфична для формата SmartScale, проект libjpeg-turbo решил отказаться от эмуляции libjpeg v9. [18]
С 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] [32]
Объединенная группа экспертов ISO/IEC по фотографии поддерживает эталонную реализацию программного обеспечения для базового JPEG (ISO/IEC 10918-1 и 18477-1) и расширений JPEG XT (ISO/IEC 18477, части 2 и 6-9), а также JPEG-файлов без потерь. LS (ИСО/МЭК 14495). [33] Он также включает в себя некоторые оптимизации mozjpeg. Хотя он также называется libjpeg, он не связан с исходным кодом, предоставленным Independent JPEG Group (IJG), и не поддерживает собственные расширения, представленные IJG с 2007 года.
Единственное беспокойство заключалось в том, что Гвидо Волльбединг вряд ли подписан на этот список, а IJG JPEG по сути разрабатывается одним человеком.