Dropbox недавно выпустил Lepton ( GitHub ), метод, который без потерь сжимает изображения JPEG в обоих направлениях, экономя в среднем 22%.
Из-за принципа «квадратного отверстия» нельзя гарантировать , что любой общий алгоритм сжатия приведет к уменьшению файла ( общий, потому что он не применяется к входным данным, ограниченным определенным форматом). Лептон использует общие характеристики JPEG, которые в случае его искажения могут привести к появлению файла большего размера, чем исходный.
Требования
Напишите программу, которая генерирует:
- Действительное изображение JPEG / JFIF,
- размером от 0,5 МБ до 1 МБ,
- не менее 256 × 256 пикселей,
- не более 4096 × 4096 пикселей,
- распознается Лептоном (он может успешно «сжать»
.lep
изображение) и - распаковывает до идентичного
.jpg
(как вход). APPx
,COM
и другие метаданные, разделы неграфического маркера ограничены в JPEG (введение произвольного количества случайных байтов в изображение для асимптотического подхода к сжатию 1: 1 неэффективно.)APP0
JFIF маркер допускается , но не с миниатюрами не допускается (должно быть ровно 16 байт)- tl; dr Если вы намеренно не помещаете метаданные в сегмент EXIF и отключаете любые миниатюры, которые ваша языковая библиотека хочет добавить в изображение, это должно быть в порядке.
Разместите код и изображение.
Если вы хотите написать программу, которая производит изображение Лептона, которое при преобразовании дает JPEG, соответствующий критериям, это нормально. Он должен оставаться одинаковым для любого количества циклов JPEG → Lepton → JPEG → ....
счет
Размер в байтах изображения Лептона, деленный на исходное изображение JPEG. Чем выше (хуже компрессия Лептона), тем лучше. Запустите Lepton с флагами и переключателями по умолчанию.
Получение Лептона
5-секундный ускоренный курс по сборке Лептона:
git clone https://github.com/dropbox/lepton.git
cd lepton
./autogen.sh && ./configure && make
# fish shell: ./autogen.sh ;and ./configure ;and make
Затем ./lepton --help
должен рассказать вам вещи.
Ответы:
Python 3 + mozjpeg + / dev / urandom, 720 × 720: средн. оценка 102%
Зависит от
mozjpeg
пакета, код предполагает, что он установлен в/usr/local/opt/mozjpeg
. (на OS X установить тривиально, просто запуститеbrew install mozjpeg
)Также это зависит от
/dev/urandom
специального файла, он используется для генерации случайных данных.Код просто передает случайные данные в
mozjpeg
компрессор (в формате TGA, потому что cjpeg понимает его и имеет очень простой заголовок), и позволяет ему создавать оптимизированный файл JPEG. Качество установлено на максимум, потому что это делает коэффициенты DCT наименее сжимаемыми, и не имеет большого значения, какой алгоритм используется для сжатия несжимаемых данных.Я проверил, что цикл jpeg-> lepton-> jpeg без потерь - это правда.
Код не в гольф, очевидно.
Пример изображения:
Интересный факт: сгенерированный файл JPEG больше исходного TGA-изображения без сжатия, хотя JPEG использует сжатие с потерями.
Интересный факт 2: Imgur (хостинг изображений по умолчанию для SO) очень плохо справляется с этим файлом - по какой-то причине он сжимает его до более низкого качества, даже если он меньше 1 МБ. Поэтому я использовал Github для загрузки примера изображения.
Интересный факт 3: В общем, mozjpeg действительно улучшает сжатие JPEG, оставаясь совместимым с существующими декодерами JPEG. И у него также есть инструмент для оптимизации файлов JPEG без потерь
jpegtran
.источник
Наивный шум, 1024 × 1024: оценка 85,55%
Соответствующий пример в Python, чтобы заставить мяч катиться. Никак не оптимизирован; Возможные недостатки:
Затем некоторые вещи, чтобы сделать вещь:
источник