Jpegtran оптимизировать без изменения имени файла - PullRequest
19 голосов
/ 07 апреля 2011

Мне нужно оптимизировать некоторые изображения, но не менять их название.

jpegtran -copy none -optimize image.jpg > image.jpg 

Однако создается впечатление, что размер файла равен 0. Когда я делаю это с другим именем файла, размер остается точно таким же.

Ответы [ 6 ]

26 голосов
/ 07 апреля 2011

как насчет:

jpegtran -copy none -optimize -outfile image.jpg image.jpg

Я ни в коем случае не эксперт по оболочкам, но я думаю, что с вашей исходной командой, как только она выполняется, устанавливается перенаправление, которое перезаписывает ваш image.jpg. Затем, когда jpegtran пытается прочитать его, он находит пустой файл.

10 голосов
/ 22 августа 2012

Я использую этот скрипт. Работает без нареканий. Надеюсь, это поможет.

https://gist.github.com/iimos/7424025

#! /bin/sh

EXTENSIONS="jpe?g"

if [ -z "$1" ]; then
    DIR="`pwd`"
else
    DIR="$1"
fi

# Optimize JPEG images
find "$DIR" -regextype posix-egrep -regex ".*\.($EXTENSIONS)\$" -type f | xargs -I{} jpegtran -optimize -progressive -outfile "{}.optimized" "{}"

# Rename xxx.jpg.optimized -> xxx.jpg
find "$DIR" -name '*.optimized' -print0 | while read -d $'\0' file; do 
    chown $(stat -c "%U:%G" "${file%.optimized}") "$file"
    chmod $(stat -c "%a" "${file%.optimized}") "$file"
    mv -f "$file" "${file%.optimized}"; 
done

Использование 1:

optimize-images.sh /images/dir

Использование 2:

cd /images/dir
optimize-images.sh 
2 голосов
/ 29 октября 2014
jpegtran -copy none -progressive -optimize -outfile filename filename

Для комплексной оптимизации: -copy none говорит jpegtran подавить все комментарии и другой лишний багаж, присутствующий в исходном jpeg, прогрессивный создает прогрессивный jpeg, -optimize выполняет фактическую оптимизацию, а -outfile устанавливает имя выходного файла.Последний параметр - это имя входного файла: если они совпадают, ваш файл оптимизируется по месту.

Редактировать: вы можете также попробовать mozjpeg, согласно этой статье о без потерьинструменты сжатия JPEG http://blarg.co.uk/blog/comparison-of-jpeg-lossless-compression-tools

2 голосов
/ 27 октября 2011

Я сделал это в три строки:

jpegtran -optimize image.jpg > image.jpg-opt
cp image.jpg-opt image.jpg
rm image.jpg-opt

Работает хорошо.

[edit:] Это работает только для одного файла за раз.

1 голос
/ 23 июля 2017

Без губки, другой альтернативой с меньшим доступом для записи на жесткий диск или твердотельный накопитель является использование / dev / shm для сохранения временного файла, а затем сразу же перезаписать его локально.

jpegtran -copy none -optimize image.jpg > /dev/shm/tmp.jpg &&  cat /dev/shm/tmp.jpg > ./image.jpg

Концепция может быть легкоадаптирован к любому сценарию, возможно, с оговорками о том, что временное имя файла не совпадает, чтобы избежать коллизий, если одновременно выполняется несколько экземпляров.Возможно, интересно подумать о какой-то уникальной схеме генерации шаблонов имен файлов, возможно, что-то вроде ${originalfilename}-jpgtrantmp-$$.

0 голосов
/ 13 декабря 2015

Другая опция, если -outfile не поддерживается:

jpegtran -copy none -optimize image.jpg | sponge image.jpg

sponge является частью moreutils .

...