Как написать сценарий оболочки для сжатия нескольких изображений с помощью imagemagick?
В настоящее время я использую эту команду в терминале для сжатия одного изображения с помощью imagemagick:
./convert_with_logging photo.jpg -quality 50% photo2.jpg
convert_with_logging - это скрипт, который содержит:
INPUT_FILENAME="$1"
OUTPUT_FILENAME="$4"
ORIGINAL_SIZE=$(wc -c "${INPUT_FILENAME}" | cut -d ' ' -f1)
convert "$@"
COMPRESSED_SIZE=$(wc -c "${OUTPUT_FILENAME}" | cut -d ' ' -f1)
echo "${OUTPUT_FILENAME} | saved size: $(expr $ORIGINAL_SIZE - $COMPRESSED_SIZE)"
Примечание. Этот сценарий преобразует и записывает сжатый размер (например, imageA.jpg | сохраненный размер: 1994825).
Сейчас я использую эту команду для сжатия нескольких изображений (jpg и jpeg):
for PHOTO in /home/dvs/Desktop/proj1/src/images/*.{jpeg,jpg}
do
BASE=`basename $PHOTO`
./convert_with_logging "$PHOTO" -quality 40% "/home/dvs/Desktop/proj1/src/compressed/$BASE"
done;
Теперь, как я могу преобразовать всю эту последнюю команду, чтобы набрать "./convert_multi_with_logging" и получить тот же результат?
Я думаю, что нам нужно добавить что-то вроде этого в скрипт:
inpath="/home/dvs/Desktop/proj1/src/images/"
outpath="/home/dvs/Desktop/proj1/src/compressed/"
1 ответ
Решение
Измените ваш скрипт на что-то вроде этого:
for PHOTO in "$1"/*.{jpeg,jpg};
do
OUTPUT_FILENAME="$(basename "$PHOTO")"
ORIGINAL_SIZE=$(wc -c "${PHOTO}" | cut -d ' ' -f1)
convert "$PHOTO" $2 $3 "$4/${OUTPUT_FILENAME%.*}.cnvrt"
COMPRESSED_SIZE=$(wc -c "$4/${OUTPUT_FILENAME%.*}.cnvrt" | cut -d ' ' -f1)
echo "${OUTPUT_FILENAME%.*}.cnvrt | saved size: $(expr $ORIGINAL_SIZE - $COMPRESSED_SIZE)"
done
и выполнить его с этими аргументами.
./convert_multi_with_logging /path/to/source -quality 50% /path/to/destination