Подтвердить что ты не робот

Jpegtran оптимизирует без изменения имени файла

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

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

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

4b9b3361

Ответ 1

как насчет:

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

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

Ответ 2

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

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 

Ответ 3

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

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

Хорошо работает.

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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

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

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

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