9.11 图像文件的批量缩放及格式转换
我们大家都会使用数码相机,也会从Internet上获取数码照片。如果需要处理大量图像文件,我们可以轻松地用脚本批量处理。这通常会涉及的任务是调整照片的大小,有时也需要转换图像格式(例如,将JPEG格式转换成PNG格式)。当我们从数码相机中获取到照片时,大分辨率的图片通常体积都比较大,我们可能需要减少图片的大小,以便于存储以及通过电子邮件发送给他人。因此我们就需要对其进行调整来降低分辨率。这则攻略将讨论如何用脚本管理图像。
9.11.1 新手上路
Imagemagick
是一款出色的图像处理工具,它包含丰富的选项,能够处理多种图像格式。大多数GNU/Linux发行版并没有安装Imagemagick
。你得自己手动安装这个软件包。convert
是我们经常要使用的命令。
9.11.2 实战演练
将一种图像格式转换为另一种图像格式:
- $ convert INPUT_FILE OUTPUT_FILE
例如:
- $ convert file1.png file2.png
我们可以通过指定缩放比或输出图像的宽度和高度来将图像调整到所需要的大小。
指定WIDTH
(宽度)或HEIGHT
(高度)来缩放图像:
- $ convert image.png -resize WIDTHxHEIGHT image.png
例如:
- $ convert image.png -resize 1024x768 image.png
必须提供WIDTH
或HEIGHT
,这样才能够使脚本自动计算其他数值,以便于在保留图像比例的同时进行缩放。
- $ convert image.png -resize WIDTHx image.png
例如:
- $ convert image.png -resize 1024x image.png
指定百分比缩放图像:
- $ convert image.png -resize "50%" image.png
让我们看一个用于图像管理的脚本:
#!/bin/bash
#文件名: image_help.sh
#用途:图像管理脚本
if [ $# -ne 4 -a $# -ne 6 -a $# -ne 8 ];
then
echo Incorrect number of arguments
exit 2
fi
while [ $# -ne 0 ];
do
case $1 in
-source) shift; source_dir=$1 ; shift ;;
-scale) shift; scale=$1 ; shift ;;
-percent) shift; percent=$1 ; shift ;;
-dest) shift ; dest_dir=$1 ; shift ;;
-ext) shift ; ext=$1 ; shift ;;
*) echo Wrong parameters; exit 2 ;;
esac;
done
for img in `echo $source_dir/*` ;
do
source_file=$img
if [[ -n $ext ]];
then
dest_file=${img%.*}.$ext
else
dest_file=$img
fi
if [[ -n $dest_dir ]];
then
dest_file=${dest_file##*/}
dest_file="$dest_dir/$dest_file"
fi
if [[ -n $scale ]];
then
PARAM="-resize $scale"
elif [[ -n $percent ]];
then
PARAM="-resize $percent%"
fi
echo Processing file : $source_file
convert $source_file $PARAM $dest_file
done
下面是输出样例,将目录sample_dir中的图像调整到原来的20%:
- $ ./image_help.sh -source sample_dir -percent 20%
- Processing file :sample/IMG_4455.JPG
- Processing file :sample/IMG_4456.JPG
- Processing file :sample/IMG_4457.JPG
- Processing file :sample/IMG_4458.JPG
将图像宽度调整到1024:
- $ ./image_help.sh -source sample_dir -scale 1024x
把-ext png
加入上面的命令,使文件格式转换成PNG。
将文件缩放或转换到指定的目录:
- $ ./image_help.sh -source sample -scale 50% -ext png -dest newdir
- # newdir作为目的目录
9.11.3 工作原理
上面的脚本image_help.sh可以接受多个命令行参数,例如-source
、-percent
、-scale
、-ext
和-dest
等。每个选项的简短描述如下。
-source
用于指定图像源目录。-percent
用于指定缩放比例,-scale
用于指定缩放宽度与高度。-percent
与-scale
不能同时出现,只能使用其中之一。-ext
用于指定目标文件格式。-ext
是一个可选的选项。如果没有指定,那么不执行格式转换。-dest
为缩放或转换格式后的文件指定目的目录。该选项也是可选的。如果没有指定,目的目录则和源目录相同。脚本的第一步就是检查命令行参数的数量是否正确,可以出现的参数数量分别是4、6或8。
借助while
循环和case
语句,我们将命令行参数解析到对应的变量。$#
是一个特殊的变量,它可以返回参数的数量。shift
命令每执行一次,就将命令行参数向左移动一个位置,这样我们就不需要使用变量$1
、$2
、$3
等,而只用一个$1
来就可以对命令参数逐个进行访问了。case
语句用来匹配$1
的值,就像C语言中的switch
语句一样。如果匹配了某个case
分支,就执行对应的语句。每一个case
分支都以;;
作为结尾。一旦将所有的参数都解析到变量percent
、scale
、source_dir
、ext
和dest_dir
中,就是用for
循环对源目录中的每一个文件进行迭代,并执行对应的转换操作。
如果变量ext
已定义(也就是说-ext
作为命令参数出现),就将目标文件的扩展名从source_file.extension更改为source_file.$ext。接下来检查是否提供了-dest
选项。如果指定了目的目录,则使用文件名切片将源路径中的目录替换成目的目录,从而形成目的文件路径。然后构造出convert
命令的参数,用以执行缩放(-resize widthx
或-resize perc%
)。参数构造完毕之后,用对应的参数执行convert
命令。
9.11.4 参考
2.11节讲解了如何提取部分文件名。