Мне нужно оптимизировать некоторые изображения, но не менять их имя.
jpegtran -copy none -optimize image.jpg > image.jpg
Однако, похоже, создается файл размером 0. Когда я делаю это с другим именем файла, размер по-прежнему остается таким же.
Мне нужно оптимизировать некоторые изображения, но не менять их имя.
jpegtran -copy none -optimize image.jpg > image.jpg
Однако, похоже, создается файл размером 0. Когда я делаю это с другим именем файла, размер по-прежнему остается таким же.
как насчет:
jpegtran -copy none -optimize -outfile image.jpg image.jpg
Я не эксперт в оболочке каким-либо образом, но я думаю, что с вашей исходной командой, как только она будет выполнена, будет настроена перенаправление, которая перезаписывает ваш image.jpg. Затем, когда jpegtran пытается его прочитать, он находит пустой файл.
Я использую этот 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
Я сделал это в трех строках:
jpegtran -optimize image.jpg > image.jpg-opt
cp image.jpg-opt image.jpg
rm image.jpg-opt
Хорошо работает.
[edit:] Это работает только для одного файла за раз.
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
Без губки другая альтернатива с более низким доступом к жесткому диску или SSD-записи - использовать /dev/shm для сохранения временного файла, а затем сразу же перезаписать его локально.
jpegtran -copy none -optimize image.jpg > /dev/shm/tmp.jpg && cat /dev/shm/tmp.jpg > ./image.jpg
Концепция может быть легко адаптирована к любому script, возможно, с предостережениями о том, что временное имя файла не является тем же самым, чтобы избежать коллизий при одновременном запуске нескольких экземпляров. Возможно, интересно подумать о какой-то уникальной схеме генерации шаблонов имен файлов, возможно, что-то вроде строк ${originalfilename}-jpgtrantmp-$$
.
Другая опция, если -outfile
не поддерживается:
jpegtran -copy none -optimize image.jpg | sponge image.jpg
sponge
является частью moreutils.