Инструмент командной строки для сжатия и оптимизации JPEG без потерь для Ubuntu

Я ищу инструмент сжатия JPEG без потерь из командной строки, который будет иметь следующие функции:

  • быть инструментом командной строки без графического интерфейса
  • Я могу предоставить список папок (где находятся мои потенциально неоптимизированные изображения), он рекурсивно пойдет и оптимизирует все изображения внутри этих папок и подпапок.
  • изображения будут сохранены с тем же именем, что и раньше (заменив старое неоптимизированное изображение на новое)

Тоже не особо важно, было бы неплохо, если бы инструмент мог

  • Дайте отчет (сколько места на файл/всего сэкономлено)
  • Можно также изменить размер изображений
  • Должен правильно обрабатывать большое количество файлов (> 1000)
  • Удалить метаданные

Ответ Нику Уайлду:

Я не знаю, кому мне доверять: вам или людям из google, которые создали pageSpeed . Когда я запускаю этот jpeg через pageSpeed, он говорит

Сжатие без потерь httpS://upload.wikimedia.org/.../Lake_mapourika_NZ.jpeg может сэкономить 16,8 КБ (уменьшение на 4%).

PS причина использования инструмента не в том, чтобы сэкономить место на моем компьютере, изображения находятся на сервере, поэтому оптимизация изображений поможет сэкономить трафик для пользователей, просматривающих изображения. По этой причине изображения должны быть доступны для просмотра, и их архивирование невозможно.

Ответы (3)

После нескольких часов игры с bash я нашел способ, как это делает Google . Он использует одну из этих двух программ:

Оба они поддерживают преобразование без потерь и с потерями. Я попробовал второй, в Ubuntu как jpegoptim Установить jpegoptim

.

Чем делать то, что я хочу, я должен сделать следующее:

find MyDirectory/ -type d -exec sh -c '
    ls "$0"/*.jpg 2>/dev/null && jpegoptim --strip-all -t "$0"/*.jpg
' {} \;

Это действительно близко к тому, что я хочу. Единственная проблема заключается в том, что я вижу много вывода о каждом сжатии файла, и я не могу избавиться от него с помощью -q, потому что он также избавляется от сводки. Но это самое близкое, что я смог получить с моими только что изученными «навыками» bash. Я задал дополнительный вопрос на Ask Ubuntu .

Это очень быстро. Обработка нескольких тысяч файлов заняла < 5 секунд.

Вы пробовали перенаправить вывод? Просто добавьте >/dev/nullв конец вашей jpegoptimкомандной строки, чтобы перенаправить STDOUT на «нирвану данных». Потенциальные ошибки (и все остальное, отправленное в STDERR) по-прежнему будут отображаться.
Я предполагаю, что >/dev/null избавится от всего вывода. Это не то, что я хочу, потому что я могу добиться того же с помощью -q
Вы не детализируете "лишнюю продукцию". Но если вещи, от которых вы хотите избавиться, легко отделяются от вещей, которые вы хотите сохранить, с помощью ключевых слов, альтернативой может быть | grep -v <not-this-keyword> | grep -v <this-neither> [...], который затем подавляет все строки, содержащие упомянутые ключевые слова.
Я не смотрел, что выводит jpegoptim. Какое резюме вы хотите сохранить? Почему вы вызываете его отдельно для каждого каталога? Вы можете спросить об этой части в Unix и Linux .
@Gilles Я уже спрашивал об этом на Ubuntu StackExchange. Я звоню отдельно для каждого каталога, потому что, если я вызову его для родительского каталога, он скажет мне что-то вроде «извините, изображения не найдены».
Почему не просто find MyDirectory/ -name '*jpg' -print0 | xargs -0 jpegoptim -s -t?
jpegoptimэто здорово, и я часто использую его, он также поддерживает файлы JPEG 2000?
С v1.3.0 я получаю только вывод out.jp2 [ERROR].
jpegtran из mozjpeg может быть еще более эффективным, рассмотрите возможность добавления его в ответ

ImageMagik convert позволяет использовать командную строку, пакетную обработку и конвертирует ваши файлы в формате jpeg в jpeg2000, что может сэкономить вам место и имеет несколько других опций. Если вы сначала не сделали резервную копию, я бы рекомендовал не перезаписывать существующие файлы, пока вы не убедитесь, что преобразование работает, поскольку с любым инструментом что-то может пойти не так.

Обратите внимание, что отдельные jpeg-файлы zip или targz обычно приводят к увеличению размера, если вам нужно сэкономить место, тогда каталоги tar и tar имеют возможность --remove-filesудалять файлы по мере их добавления в архив. Хотя это не уменьшит размер файлов, вы будете тратить место только после одного файла, а не после каждого файла.

Для информации:

$ convert -list сжать

B44 B44A BZip DXT1 DXT3 DXT5 Fax Group4 JBIG1 JBIG2 JPEG JPEG2000 Lossless LosslessJPEG LZMA LZW Нет Piz Pxr24 RLE Zip RunlengthEncoded ZipS

Спасибо. Если вам интересно, я нашел, как это делает Google.
Я думаю, что надежнее проверить convert -list format. У меня есть JPEG2000 в параметрах сжатия, но не в форматах, и результат convert -compress jpeg2000 00001.tif 00001.pdf convert: delegate library support not built-in 00001.pdf' (JP2) @ error/pdf.c/WritePDFImage/1283.`
Обратите внимание, что вы можете определить целевой размер с помощью jpeg:extent, например, convert -define jpeg:extent=400KB. imagemagick.org/discourse-server/viewtopic.php?t=15386
convertникогда не будет без потерь, если вы выводите в формат с потерями. поэтому эта часть не по теме.

JPEG ЯВЛЯЕТСЯ форматом с потерями - они не могут быть сжаты с помощью сжатия JPEG без потерь. Так что нет инструмента, который может это сделать.

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

Или другим методом может быть индивидуальное сжатие zip/7z/gzip (и т. д.) и удаление оригиналов.

Если требуется какой-либо из этих вариантов, отредактируйте или создайте новый вопрос.

Спасибо за Ваш ответ. Пожалуйста, проверьте редактирование моего вопроса.
К сожалению, сжатие jpeg по отдельности увеличивает их размер, так как есть накладные расходы, и они уже сжаты. Архивирование/targz может сэкономить место, если вы заархивируете папку, заполненную пустым пространством на диске после сохранения каждого изображения.
Ребята, это совершенно неверный ответ. Он не только предлагает неправильный инструмент для выполнения работы, но и передает неверную информацию о том, как работает JPEG. Не понимаю, почему кто-то поставил +1
JPEG со 100% качеством не имеет потерь.
@ElliottFrisch Нет, JPEG со 100% качеством по-прежнему с потерями . ТАК: Jpeg без потерь, когда качество установлено на 100? . JPEG2000 имеет режимы с потерями и без потерь, но это нечто другое.
JPEG также имеет режим без потерь, хотя почти никогда не используется.
Вы можете уменьшить размер файлов JPEG, удалив ненужные метаданные, поэтому, хотя информация об изображении может быть не сжата, результатом будет меньший размер файла.