我该如何编写一个 shell 脚本来使用 imagemagick 压缩多个图像?

我该如何编写一个 shell 脚本来使用 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

相关内容