Оптимизация изображений в Linux

Оптимизация изображений в Linux

При всей популярности облачного хранения, многие пользователи Linux держат библиотеки изображений на своих жестких дисках — а потом ломают голову, как оптимизировать занятое ими место. На нашем уроке мы беремся за огромную библиотеку фотографий, которая росла не один год — идеальная задача для администраторов сервера, которые занимаются поддержкой огромного количества данных пользователя, или кому там еще нужно хранить кучу изображений.

Мы покажем, как высвободить место без ущерба для качества изображения, и расскажем, как с комфортом и удобством просматривать вашу новую оптимизированную библиотеку изображений. Мы рассмотрим способы удаления дубликатов файлов с помощью простых надежных инструментов, затем выжмем дополнительные биты из существующих файлов JPEG и PNG и, наконец, смело конвертируем наши изображения в несколько форматов следующего поколения.

Прежде чем погрузиться в волнующий мир новых технологий, давайте вспомним более брутальный, но весьма эффективный способ заставить ваши файлы ужаться. Скажем, у вас есть несколько изображений PNG, и вы хотите уменьшить их вес. Можно немного уменьшить их масштаб и заново их сжать в режиме JPEG с потерями, и они всё равно будут неплохо выглядеть на экране:

Этот пример использует mogrify из пакета ImageMagick, который доступен почти во всех дистрибутивах Linux. Вы даете ему указание снизить размер всех PNG файлов в текущей директории до 70 % и конвертировать их в JPEG со сжатием 75 %. Таков основной подход, и он работает только если вы можете позволить себе немного потерять в качестве изображения. Если вас это не привлекает, читайте дальше, вы найдете отличные советы по волшебству без потерь!

РЕКОМЕНДУЕМ: Самые легкие дистрибутивы Linux

Поиск и анализ одинаковых изображений

Одинаковые файлы изображений часто являются результатом копирования фото с внешнего носителя на жесткий диск, когда вы пытаетесь вручную рассортировать изображения, используя директории по дате. В конечном итоге в подобных директориях оказываются частично дублированные наборы изображений, что не идеально.

Избыток резервных и простых копий тоже вносит свою лепту в растущее количество лишних файлов. У большинства дистрибутивов Linux в репозиториях имеется приложение fdupes, которое должно находить одинаковые файлы, но для изображений нужно нечто более мощное.

Дубликаты изображений могут иметь другие имена и размеры, и нам также может понадобиться найти не одинаковые, но очень похожие изображения, например, отредактированные или те, которые снимались в течение длительной сессии съемки. Очевидно, мы можем взять для решения этой проблемы некую нейронную сеть, но это будет всё равно что колоть орехи кузнечным молотом.

Есть куда более легковесное решение — хоть и со странным названием  Findimagedupes. Это набор скриптов на языке Go, который анализирует содержимое указанной директории и помещает отпечатки пальцев изображения в свою базу данных. Findimagedupes изучает факторы сходства и представляет список одинаковых или визуально похожих наборов изображений, которые вы, возможно, захотите убрать. Вы можете настроить порог сходства, пропустить проверку на наличие одинаковых изображений и использовать рекурсивный поиск в Findimagedupes. Вот вам пример:

Эта команда будет искать внутри ~/Pictures, включая поддиректории. Результат выводится в виде простого списка, где каждая строка состоит из полного пути к изображению, разделенного пробелами. Чтобы настроить сходство, укажите параметр -t, за которым следует число от 0 до 63, где 0 означает, что Findimagedupes будет определять только одинаковые изображения, а 63 означает, что он будет считать все изображения похожими. В следующем примере мы использовали разумное и реалистичное число между этими двумя крайностями:

Прямо сейчас не вполне очевидно, что делать дальше, но, к счастью, Findimagedupes позволяет открывать каждый набор изображений с помощью внешнего приложения, вот так:

В этом примере мы использовали Feh, поскольку это наименее сложный инструмент для просмотра изображений, но выбор программы остается за вами. Этот неавтоматизированный метод даст наиболее точные результаты, если вы хотите удалить дубликаты после тщательной проверки.

Еще один способ вычислить сходство изображений основан на вычислении скалярной оценки сходства для каждой пары. Мы будем использовать Butteraugli с www.github.com/google/but-teraugli, простую и дружелюбную к пользователю программу для измерения выявленных различий между изображениями на основе научного подхода. Butteraugli легко компилируется (просто запустите $ make) и предлагает простой синтаксис командной строки:

Butteraugli принимает файлы JPEG и PNG и требует, чтобы оба файла в паре имели одинаковый размер в пикселях. Выводится число — показатель сходства, где 0 означает, что изображения одинаковы, а любое другое положительное число отражает степень различия. Отличной дополнительной функцией Butter-augli является ее способность рисовать «тепловую карту» различий между изображениями. Всё, что вам надо сделать — определить файл вывода:

Полученный в результате PPM-файл покажет вам области, где есть различия между вашими изображениями. Практическая цель Butteraugli — помочь определить изменения, невооруженным глазом не видимые. И если Findimagedupes помогает вам определить похожие изображения, то Butteraugli показывает, что именно в них различается.

Теперь предположим, что все изображения, пережившие нашу Великую Чистку, представляют собой ценность, но нам всё равно надо уменьшить занимаемое ими место. Инженеры Google создали инструмент, который уменьшает JPEG-файлы без ущерба для качества. Guetzliзаявляет о 20-30 %-снижении размера файла по сравнению с обычным способом, которым вы записываете JPEG в Linux с помощью libjpeg. По словам разработчиков Guetzli, он достигает баланса между минимальными потерями и размером файла, используя алгоритм поиска, который пытается преодолеть различие между психовизуальным моделированием формата JPEG и психовизуальной моделью Guetzli.

Скорость оптимизации изображений

Guetzli работает неспешно. Согласно документации Google, у него уходит около минуты на кодирование одного мегапикселя растровых данных. Это означает, что Guetzli будет обрабатывать каждую из ваших фотографий мучительно долго, но зато программа выдаст наилучшую оптимизацию размера файла JPEG для изображений, которые были сжаты с коэффициентом между 84 и 100. Иными словами, Guetzli полезен в случае, если вам надо поддерживать очень высокое качество изображения, не увеличивая сжатие JPEG. Это отлично для разовой оптимизации, которая высвободит место на вашем файловом сервере или ином хранилище.

Оптимизация изображений в Linux с Guetzli
Для тех, кто пока делает самые первые шаги в оптимизации, Guetzli включает базовое приложение GUI, которое дает вам возможность сохранить существующие изображения в разных форматах.

Скачайте код с www.github.com/google/guetzli, проверьте наличие у вас файлов разработки libpng и libjpeg и запустите $ make в директории проекта. Вы увидите свой бинарник в bin/Release, и сейчас самое время дать Guetzli возможность выполнить свою работу:

Коэффициент 84 является наилучшим (и наинизшим из возможных) для Guetzli. При тестировании на наборе изображений стало ясно, что ни один другой метод сжатия JPEG не сравнится с Guetzli по размеру файла при этом коэффициенте. Вот пример команды для групповой обработки нескольких файлов одновременно:

При работе с одним файлом вы можете обойтись без командной строки, обратившись к стороннему графическому инструменту Guetzli, который вы найдете на www.github.com/till213/GuetzliImage-IOPlugin. Он предлагает библиотеку с общим доступом и Image-plugin на Qt5 вместе с дружелюбным к новичкам приложением-примером, куда вы можете загрузить для просмотра свои JPEG, настроить некоторые опции и, наконец, «испечь» свой Guetzli. И хотя это выпекание невероятно нагружает CPU, это единственный новейший инструмент оптимизации JPEG на данный момент. Качество полученного в результате изображения превосходно — вы не сможете отличить его от оригинала.

РЕКОМЕНДУЕМ: Мониторинг в Linux с помощью командой строки

Оптимизация изображений с Lepton

Мы переходим к следующей новой технологии уменьшения файлов JPEG. Lepton — кодировщик с открытым кодом от Dropbox. Он заявляет, что может отжать еще 22 % из ваших обычных JPEG, и нам стало интересно доказать эту цифру в наших тестах.

Запустить Lepton легко: клонируйте код проекта с www.github. com/dropbox/lepton и скомандуйте $ ./autogen.sh && ./configure && make && sudo make install

Синтаксис команд Lepton тоже простой:

Как видите, Lepton сжимает ваш файл и выдает вам результат в неизвестном формате. Начиная с этого момента, вы больше не можете открыть, отредактировать или как-то еще поработать с вашими файлами — пока снова их не распакуете:

Поскольку нет сторонней интеграции Lepton в популярные просмотрщики изображений для Linux, он, очевидно, выступает просто в роли менеджера архивов. Всё же это полезно для некоторых приложений, например, для хранения огромных наборов данных на диске резервного копирования. Важно отметить, что Lepton обеспечивает кодирование без потерь, поэтому исходный файл и обработанный файл JPEG-LEP-JPEG одинаковы.

Оптимизация изображений в Linux с Lepton
Сжатие Lepton работает поразительно быстро, выдавая в результате значительно меньшие файлы и очень удобный рисунок, пока-зывающий экономию места в процентах.

Lepton работает очень быстро и обеспечивает лучший коэффициент сжатия, чем Guetzli, но помните, что в системе без Lepton доступа к своим файлам вы не получите, тогда как Guetzli обеспечивает идеальную обратную совместимость своих файлов JPEG. Благодаря высокой производительности Lepton идеален для работы с большими изображениями.

Простейший способ провести реальный тест — взять файл, например, в открытом хранилище Wikimedia (http://bit.ly/wiki-big-im-ages) и попытаться закодировать его с помощью Lepton. Обратите внимание, что Lepton может работать только с JPEG, не превышающими 128 МБ, так что не забудьте об этом, выбирая большие файлы для его проверки. Более того, вам определенно придется провести дополнительные аргументы для Lepton, чтобы он обработал изображение такого размера, вот так:

Мы попытались сжать файл 0-cynefin-ORIGINEEL.jpg (93,9 МБ) и получили файл 0-cynefin-ORIGINEEL.lep, размером всего 64 МБ. Это 31 % сжатия! Реальные результаты получаются разными на разных изображениях, и всё зависит от того, с каким именно изображением вы работаете. Например, если на изображении имеются области со сплошным заполнением, штриховой графикой или рисунками, то кодировщик справится намного лучше, чем при работе с фотографией реального объекта.

Учитывая то, что Guetzli и Lepton работают с JPEG, нам было любопытно сжать текстовый файл, используя оба кодировщика. При применении к набору обычных фото 11-15 MP первая стадия дала нам сжатие между 14 и 20 %, а вторая — дала сжатие еще на 20-25 %. Общая производительность этой комбинации была между 30 и 40 %, что просто потрясающе для сжатия почти без потерь (в конце концов, это JPEG).

Оптимизация изображений с FLIF

Мы уже ступили на почти неисследованную землю альтернативных форматов файлов изображений, и теперь пришла пора сменить формат JPEG на PNG.

Есть много случаев, когда PNG предпочтительнее JPEG, например, в скриншотах, изображениях в Сети, да и для всего остального, кроме фотографий. FLIF означает Free Lossless Image Format, и он основан на сжатии MANIAC. MANIAC (Meta-Adaptive Near-zero Integer Arithmetic Coding) — алгоритм для энтропийного кодирования, использующий контекстно-зависимую двоичную арифметику.

По нашему опыту, FLIF является почти идеальной заменой форматов PNG, lossless WebP, lossless BPG, lossless JPEG2000 и lossless JPEG XR в плане коэффициента сжатия. Большое преимущество FLIF в том, что это универсальный формат, пригодный для кодирования любого вида изображений, будь то фотография, рисунок, карта или что-либо другое, и вы в любом случае всё равно выиграете дополнительные килобайты.

Начните с клонирования кода FLIFhub и затем перейдите в директорию src внутри дерева root. У FLIF не так уж много зависимостей помимо пакета разработки libpng, но чтобы скомпилировать программу, надо указать цели Automake вручную:

Эта команда понятна сама по себе: вы получаете исполняемый кодировщик, две библиотеки с распределенным доступом для кодирования и декодирования и простую программу просмотра для файлов FLIF. Скопируйте flif и viewfif в /usr/bin (или любое другое место в $PATH), скопируйте библиотеки куда-нибудь вроде /usr/ lib64 (в разных дистрибутивах Linux это по-разному), и вы готовы. Кодировщик FLIF имеет много опций командной строки (см. $ flif —help output), но если вы их не используете, то он решит, что вам нужно сжатие без потерь с интерлейсингом, как в следующем примере:

Вы можете использовать с FLIF только файлы PNG или PNM, и для удобства вы должны всегда использовать расширение .flif для полученных в результате файлов. Результатом является файл, более чем на 40 % меньше обычного PNG (как те, которые сжаты настройками GIMP по умолчанию) и почти на 15 % меньше, чем lossless WebP. FLIF обеспечивает невероятную оптимизацию файлов и превосходит все остальные форматы файлов. К тому же кодировщик довольно быстр, и если вы посмотрите на нагрузку на CPU, она где-то между Guetzli и Lepton.

FLIF существует уже некоторое время, и уже есть программы, которые по умолчанию поддерживают FLIF. Самая интригующая — Qt FLIF Plugin (www.github.com/spillerrec/qt-flif-plugin), которая отлично справляется с задачей выхода FLIF в большой мир. Плагин позволяет всем программам на Qt по умолчанию поддерживать FLIF, как если бы это был еще один базовый растровый формат типа PNG, TIFF, JPEG и прочих.

Сжатие изображений в Linux FLIF Dolphin
Родная поддержка в Qt открывает больше возможностей для FLIF. Вот поддержка значков FLIF в Dolphin.

Чтобы плагин заработал, нужна некоторая аккуратность в размещении его файлов. После компиляции кода вы получаете библиотеку с распределенным доступом libflif.so, имя которой совпадает с именем библиотеки, поставляемой с самим FLIF. Поэтому, хотя у вас уже есть /usr/lib64/libflif.so, вы должны скопировать libflif.so плагина в пункт назначения по умолчанию ваших системных плагинов изображений, например, /usr/lib64/qt5/plugins/imageformats/. Файлы *.desktop надо отправить в /usr/share/kservices5/qimageio-plugins, а x-flif.xml должен поселиться в /usr/share/mime/packages.

Если вы не используете KDE Plasma, вы всё равно можете облегчить себе жизнь благодаря отдельному приложению Imgviewer (www.github.com/spillerrec/imgviewer). Свяжите .flif с Imgviewer в вашем менеджере файлов — и сможете просматривать изображения FLIF на любом рабочем столе.

РЕКОМЕНДУЕМ: Управление программами из консоли Linux

Создание эскизов

При просмотре изображений в менеджере файлов вы рассчитываете увидеть их миниатюры. Создать миниатюры для изображений JPEG или PNG просто для всех основных менеджеров файлов, типа Dolphin, Nautilus или Nemo. Но стоит вам взяться за альтернативные форматы файлов, как всё становится интереснее.

Ранее мы упоминали Qt FLIF Plugin, который решает проблему эскизов FLIF в Dolphin, но вы также можете получить эскизы FLIF в Nautilus или Nemo с помощью другой технологии. Создайте исполняемый файл /usr/local/bin/flif-thumbnailer с помощью:

Затем создайте еще один файл, /usr/share/thumbnailers/flif. thumbnailer, и заполните его таким кодом:

Наконец, зарегистрируйте новый MIME-тип файла, создав файл /usr/share/mime/packages/flif.xml. Заполните его такими строками:

Вот вы всё и сделали. Приведенный метод не слишком красив, поскольку вы просите thumbnailer конвертировать FLIF в PNG, чтобы нарисовать каждую миниатюру, но он надежно работает и дает достойную производительность.

То же можно сделать для любого другого формата файлов, если вы знаете команду декодирования. В случае Lepton просто замените flif -d “$1” “$temp” на lepton “$1” “$temp” и соответственно измените остальные файлы для Lepton, и всё должно работать гладко. Процесс декодирования Lepton намного быстрее, чем процесс, используемый во FLIF, так что миниатюры будут быстрее создаваться для .lep-файлов.

Более широкое внедрение FLIF

Каким бы расширенным ни был новый формат файлов, широкая аудитория не примет его, пока он не будет поддерживаться по умолчанию приложениями промышленного стандарта. У FLIF всё идет хорошо, так как мы уже можем кодировать и декодировать ‘.flif-файлы с помощью ImageMagick (команды типа mogrify и convert — ее компоненты). Мы не гарантируем, что ваша имеющаяся установка ImageMagick сможет работать с FLIF прямо сейчас, поскольку многие производители Linux всё еще считают FLIF экспериментальным форматом и не включают дополнительных флагов компиляции при создании своих пакетов ImageMagick. Но компиляция собственного экземпляра ImageMagick в Linux не так уж трудна.

Еще одним большим достижением могло бы стать включение поддержки FLIF в главное дерево браузера Chromium. Chromium — самая популярная базовая технология для десятков производных по всему миру (если вы способны справиться с компиляцией огромного пакета исходников Chromium, то вполне сможете создать собственный доморощенный браузер!).

Пока что FLIF не является частью Chromium, потому что он еще не достиг зрелости. С другой стороны, Google продвигает собственный формат WebP, это прямой конкурент FLIF. В большинстве тестов FLIF превосходит WebP с солидным отрывом, но когда речь идет об использовании графики в Интернете, разница несущественна.

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (Пока оценок нет)
Загрузка...
Понравилась статья? Поделиться с друзьями:
Добавить комментарий