- PVSM.RU - https://www.pvsm.ru -
Изображения в формате JPEG, помимо собственно файлов с расширением .jpg, можно встретить внутри PDF-файлов и TIFF-файлов.
Стейкхолдеров технологии JPEG можно, наверное, разделить на следующие группы:
Автор этой статьи принадлежит в основном к последней группе, и точно не принадлежит к числу художественных фотографов. Это должно вносить в повествование определенный перекос, который, тем не менее, полезен как раз для иллюстрации возможных траекторий в пространстве решений.
Кратко о процессе превращения исходного изображения в JPEG:
Единственной операцией, при которой происходит потеря информации, является квантизация. Все остальные операции происходят без потерь.
У разных стейкхолдеров разные производственные циклы, в которых варьируются следующие фазы:
Оставаясь в пределах стандартного JPEG-формата, мы можем варьировать следующее:
Выходя за пределы стандартного формата файлов, но сохраняя базовую модель JPEG-кодирования мы можем использовать нестандартную схему сжатия коэффициентов, экономя место для хранения (а также для отображения, если мы контролируем конечное устройство).
Если финальным форматом является стандартный PDF, и нашим исходником являются отсканированные книжные страницы, то мы можем использовать технологию разделения изображений в черно-белую и цветную части. Если мы контролируем конечное устройство, то мы можем использовать другой нестандартный “формат”.
Ключевой момент: многие технологии, здесь описанные, помогают уменьшать размер файла. Важно понимать, что на самом деле это обеспечивает возможность улучшать качество картинки, оставаясь в пределах приблизительной цели по размеру файла.
Рассмотрим каждую размерность пространства возможных решений по отдельности.
Технология JPEG-сжатия основана на психовизуальной модели зрения: человеческий глаз терпит потерю высокочастотных деталей изображения; человек лучше воспринимает различия в яркости, чем различия в цвете. Существуют стандартизованные метрики корректности воспроизведения исходной картинки, основанные на формуле SSIM (Structural Similarity), которые можно вычислять автоматически и ставить целевые значения.
Если мы можем варьировать исходные пиксели, оставаясь в рамках целевых значений корректности воспроизведения, то мы, в принципе, можем подбирать такие значения пикселей, которые после квантизации сжимаются лучше, чем без такого подбора. Мы не знаем, использует ли какой-нибудь софт такую технологию.
Матрицы квантизации являются основным механизмом, обеспечивающим качество воспроизведения при приемлемом коэффициенте сжатия. Есть несколько стандартных дефолтных матриц, включая ту, которая была создана больше 25 лет назад на основе анализа корпуса тестовых изображений, созданных тогда же; если использовать стандартные матрицы, то все будет более-менее в порядке, если не нужно заморачиваться.
Вообще говоря, оптимально было бы генерировать отдельную матрицу квантизации для каждого изображения, анализируя его содержимое. Производители фотоаппаратов используют свои запатентованные методы генерации. Adobe Photoshop, говорят, умеет анализировать изображение и подбирать подходящую матрицу.
Качество сжатия JPEG — это просто вещественный коэффициент, который применяется к элементам стандартных матриц квантизации, заставляя ее отбрасывать все больше и больше информации.
Интересный факт: матрицы квантизации можно использовать в компьютерной криминалистике для идентификации устройства, которым была сделана фотография.
Зачастую файлы в формате JPEG являются де-факто исходными материалами, потому что хранить изображения в некомпрессированных форматах нецелесообразно. Также иногда у нас просто нет доступа к исходному материалу на бумаге, а есть, например, только PDF-файл неизвестного происхождения и сомнительного качества. Поэтому для многих приложений имеет смысл аккуратно работать с DCT-коэффициентами как объектами первого класса, по возможности применяя к ним преобразования без потерь.
Работа на уровне матриц DCT-коэффициентов позволяет делать несколько преобразований с минимальными потерями (или вообще без потери). Операции, которые требуют полного перекодирования пикселей, здесь не рассматриваются.
Преобразования с минимальными потерями:
Так как мы знаем, что следующей операцией после квантизации будет сжатие, то в принципе теоретически мы можем слегка варьировать коэффициенты так, чтобы они лучше сжимались, но при этом декодировались примерно в те же пиксели, что и исходное изображение. Неизвестно, есть ли реализации, использующие этот подход.
Стандартный JPEG поддерживает Huffman-сжатие коэффициентов, а также арифметическое кодирование.
Реализация Huffman-сжатия очень часто самая простая и наивная; в частности, компрессор сжимает коэффициенты, рассматривая их как случайные данные. Если мы учтем тот факт, что это коэффициенты двумерной матрицы, которая кодирует изображение, то мы можем получить существенно лучшие результаты. Пережатие коэффициентов на этом уровне происходит без потерь.
Еще один способ улучшить сжатие — перекодировать файл в progressive JPEG. При этом коэффициенты одного порядка группируются вместе, что обычно приводит к уменьшению размера файла. Это тоже операция сжатия без потерь. Кроме того, progressive JPEG быстрее начинает рендериться при загрузке файла, что может быть отдельным дополнительным плюсом на вебе.
Второй стандартный способ сжатия — арифметическое кодирование. К сожалению, этот способ поддерживается только специализированными инструментами, в частности, большинство распространенных браузеров его не поддерживают. Это связано с сомнительным (в прошлом) патентным статусом арифметического кодирования. Простое пережатие картинок с арифметическим кодированием дает существенную экономию размера при отсутствии потерь. Этот способ, конечно, можно использовать, если мы контролируем реализацию клиентского устройства, или же если картинки используются только для хранения.
Если мы полностью контролируем клиентское устройство или если мы хотим только хранить картинки, то мы можем использовать нестандартные схемы сжатия, которые лучше используют тот факт, что объектом сжатия являются картинки. Например, интересная программа PackJPG умеет сжимать JPEG без потерь примерно на 20%, но результат сохраняется в нестандартном формате.
Для некоторых картинок, в особенности для сканированных печатных страниц, можно разделить изображение на черный-белый (или другой палитровый) слой и “уточняющую” подложку в полноцветном формате. Оба этих слоя можно сжать раздельно в оптимальном для этого формате. Например, для PDF черно-белый слой можно сжать с помощью JBIG2, а цветной — в JPEG2000, JPEG или PNG.
Аналогичная технология используется в формате DJVU.
Если мы контролируем клиентское устройство, то мы можем делать аналогичные преобразования, например накладывая в HTML картинки друг на друга.
https://en.wikipedia.org/wiki/JPEG [1] очень хорошее обзорное описание. Некоторые параграфы становятся ясны только после изучения других ссылок.
http://www.ijg.org/ [2] референсная реализация формата. Написана на суперпортабельном C, поэтому крайне не оптимизирована.
http://www.libjpeg-turbo.org/ [3] оптимизированная реализация JPEG
http://www.libjpeg-turbo.org/About/Jpeg-9 [4] Критика IJG + http://www.libjpeg-turbo.org/About/SmartScale [5] критика неоднозначной новинки SmartScale
http://www.libjpeg-turbo.org/About/Mozjpeg [6] очень хороший технический анализ Mozjpeg
https://github.com/mozilla/mozjpeg [7] реализация JPEG, оптимизированная под специфические распространенные use-cases
http://jpegclub.org/jpegtran/ [8] утилита для преобразования JPEG-файлов с минимальными потерями
https://linux.die.net/man/1/exiftran [9] утилита для работы с JPEG-файлами, повернутыми с помощью EXIF.
https://github.com/ifad/pdfbeads [10] скрипт для генерации PDF-файлов с помощью разделения слоев
https://en.wikipedia.org/wiki/DjVu#Compression [11] описание разделения слоев в DjVu
https://github.com/packjpg [12] набор библиотек и утилит для низкоуровневой манипуляции JPEG-файлами
http://code.flickr.net/2017/01/05/a-year-without-a-byte/ [13] рассказ о том, как в Flickr оптимизировали хранение и раздачу картинок
Автор: squadette
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/obrabotka-izobrazhenij/246245
Ссылки в тексте:
[1] https://en.wikipedia.org/wiki/JPEG: https://en.wikipedia.org/wiki/JPEG
[2] http://www.ijg.org/: http://www.ijg.org/
[3] http://www.libjpeg-turbo.org/: http://www.libjpeg-turbo.org/
[4] http://www.libjpeg-turbo.org/About/Jpeg-9: http://www.libjpeg-turbo.org/About/Jpeg-9
[5] http://www.libjpeg-turbo.org/About/SmartScale: http://www.libjpeg-turbo.org/About/SmartScale
[6] http://www.libjpeg-turbo.org/About/Mozjpeg: http://www.libjpeg-turbo.org/About/Mozjpeg
[7] https://github.com/mozilla/mozjpeg: https://github.com/mozilla/mozjpeg
[8] http://jpegclub.org/jpegtran/: http://jpegclub.org/jpegtran/
[9] https://linux.die.net/man/1/exiftran: https://linux.die.net/man/1/exiftran
[10] https://github.com/ifad/pdfbeads: https://github.com/ifad/pdfbeads
[11] https://en.wikipedia.org/wiki/DjVu#Compression: https://en.wikipedia.org/wiki/DjVu#Compression
[12] https://github.com/packjpg: https://github.com/packjpg
[13] http://code.flickr.net/2017/01/05/a-year-without-a-byte/: http://code.flickr.net/2017/01/05/a-year-without-a-byte/
[14] Источник: https://habrahabr.ru/post/322554/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.