Shell脚本来调整图像大小,在Linux中转换图像格式
我们所有人都从手机和相机中下载照片。在通过电子邮件发送图像或者将其发布到Web之前,我们可能需要调整图像大小或者更改图像格式。我们可以使用脚本使用ImageMagick执行批处理图像调整大小和其他任务
在本文中,我们将使用脚本来批量执行以下任务
更改图像尺寸
转换图像格式
ImageMagick
ImageMagick是一个免费的开源软件套件,用于显示,转换和编辑光栅图像和矢量图像文件。
它可以读取和写入200多种图像文件格式。
在开始执行shell脚本之前,我将展示一些与ImageMagick相关的示例
转换图像格式
要转换图像格式,我们将使用ImageMagick的隐蔽工具。
# convert -verbose DSC_0091.JPG DSC_0091.PNG DSC_0091.JPG JPEG 6016x4000 6016x4000+0+0 8-bit DirectClass 8.574MB 0.230u 0:00.240 DSC_0091.JPG=>DSC_0091.PNG JPEG 6016x4000 6016x4000+0+0 8-bit DirectClass 21.95MB 1.910u 0:01.899
其中:我们将JPG格式的图像转换为PNG。
调整图像大小
我们可以通过指定缩放百分比或者输出图像的宽度和高度来调整图像的大小。要通过指定宽度或者高度来调整图像大小,请使用以下命令:
# convert -verbose DSC_0688.JPG -resize 1024x768 DSC_0688_resized.JPG DSC_0688.JPG JPEG 6016x4000 6016x4000+0+0 8-bit DirectClass 12.83MB 0.270u 0:00.270 DSC_0688.JPG=>DSC_0688_resized.JPG JPEG 6016x4000=>1024x681 1024x681+0+0 8-bit DirectClass 696KB 2.490u 0:00.639
如果缺少WIDTH或者HEIGHT,则将自动计算任何缺失的内容以保留图像的宽高比:
# convert -verbose DSC_0560.JPG -resize 1024x DSC_0560_resized.JPG DSC_0560.JPG JPEG 6016x4000 6016x4000+0+0 8-bit DirectClass 10.97MB 0.230u 0:00.230 DSC_0560.JPG=>DSC_0560_resized.JPG JPEG 6016x4000=>1024x681 1024x681+0+0 8-bit DirectClass 672KB 1.860u 0:00.479
另请阅读:
Shell脚本检查Linux中成功和失败的登录尝试Shell脚本检查Linux中最重要的内存和CPU消耗过程
样例Shell脚本
让我们跳到我们的shell脚本来批量调整图像大小。
batch_image_resize.sh
脚本接受以下参数:
-source:指定图像的源目录。
-dest:指定转换后的图像文件的目标目录。如果未指定-dest,则目标目录将与源目录相同。
-ext:指定转换的目标文件格式。
-percent:指定缩放比例。
-scale:`指定缩放的宽度和高度。
" -percent"和" -scale"参数都可能不会出现。
该脚本首先检查命令参数的数量。四个,六个或者八个参数均有效。
#!/bin/bash #Filename: batch_image_resize.sh #Description: A script for image management if [ $# -ne 4 -a $# -ne 6 -a $# -ne 8 ]; then echo Incorrect number of arguments exit 2 fi while [ $# -ne 0 ]; do case in -source) shift; source_dir= ; shift ;; -scale) shift; scale= ; shift ;; -percent) shift; percent= ; shift ;; -dest) shift ; dest_dir= ; shift ;; -ext) shift ; ext= ; 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
现在让我们执行batch_image_rezize.sh
脚本以基于百分比调整图像大小。在调用下面的脚本之前,是我所有图像的大小
[root@server1 images]# ls -lSh total 188M -rw-r--r--. 1 root root 21M Jan 12 00:53 DSC_0091.PNG -rw-r--r--. 1 root root 13M Apr 16 2016 DSC_0691.JPG -rw-r--r--. 1 root root 13M Apr 16 2016 DSC_0688.JPG -rw-r--r--. 1 root root 12M Apr 16 2016 DSC_0687.JPG -rw-r--r--. 1 root root 12M Apr 15 2016 DSC_0562.JPG -rw-r--r--. 1 root root 12M Apr 15 2016 DSC_0559.JPG -rw-r--r--. 1 root root 12M Apr 15 2016 DSC_0561.JPG -rw-r--r--. 1 root root 12M Apr 16 2016 DSC_0690.JPG -rw-r--r--. 1 root root 11M Apr 15 2016 DSC_0573.JPG -rw-r--r--. 1 root root 11M Apr 15 2016 DSC_0560.JPG -rw-r--r--. 1 root root 9.7M Apr 14 2016 DSC_0096.JPG -rw-r--r--. 1 root root 9.5M Apr 14 2016 DSC_0094.JPG -rw-r--r--. 1 root root 9.5M Apr 16 2016 DSC_0689.JPG -rw-r--r--. 1 root root 9.3M Apr 14 2016 DSC_0095.JPG -rw-r--r--. 1 root root 8.2M Apr 14 2016 DSC_0092.JPG -rw-r--r--. 1 root root 8.2M Apr 14 2016 DSC_0091.JPG -rw-r--r--. 1 root root 7.8M Apr 14 2016 DSC_0093.JPG
我将创建一个新目录,在此目录中我将存储大小调整后的图像
[root@server1 images]# mkdir /new_dir
现在执行脚本以将图像调整为80%
[root@server1 images]# /tmp/batch_image_resize.sh -source /images/-percent 80% -dest /new_dir/ Processing file : /images//DSC_0091.JPG Processing file : /images//DSC_0091.PNG Processing file : /images//DSC_0092.JPG Processing file : /images//DSC_0093.JPG Processing file : /images//DSC_0094.JPG Processing file : /images//DSC_0095.JPG Processing file : /images//DSC_0096.JPG Processing file : /images//DSC_0559.JPG Processing file : /images//DSC_0560.JPG Processing file : /images//DSC_0561.JPG Processing file : /images//DSC_0562.JPG Processing file : /images//DSC_0573.JPG Processing file : /images//DSC_0687.JPG Processing file : /images//DSC_0688.JPG Processing file : /images//DSC_0689.JPG Processing file : /images//DSC_0690.JPG Processing file : /images//DSC_0691.JPG
现在验证新尺寸,我们可以看到图像尺寸减小到原始尺寸的80%。
[root@server1 images]# ls -lSh /new_dir/ total 142M -rw-r--r--. 1 root root 16M Jan 12 01:02 DSC_0091.PNG -rw-r--r--. 1 root root 9.5M Jan 12 01:02 DSC_0691.JPG -rw-r--r--. 1 root root 9.3M Jan 12 01:02 DSC_0688.JPG -rw-r--r--. 1 root root 9.2M Jan 12 01:02 DSC_0562.JPG -rw-r--r--. 1 root root 9.1M Jan 12 01:02 DSC_0559.JPG -rw-r--r--. 1 root root 9.1M Jan 12 01:02 DSC_0561.JPG -rw-r--r--. 1 root root 9.0M Jan 12 01:02 DSC_0687.JPG -rw-r--r--. 1 root root 8.7M Jan 12 01:02 DSC_0690.JPG -rw-r--r--. 1 root root 8.3M Jan 12 01:02 DSC_0573.JPG -rw-r--r--. 1 root root 8.0M Jan 12 01:02 DSC_0560.JPG -rw-r--r--. 1 root root 7.5M Jan 12 01:02 DSC_0689.JPG -rw-r--r--. 1 root root 7.2M Jan 12 01:02 DSC_0096.JPG -rw-r--r--. 1 root root 7.0M Jan 12 01:02 DSC_0095.JPG -rw-r--r--. 1 root root 7.0M Jan 12 01:02 DSC_0094.JPG -rw-r--r--. 1 root root 6.2M Jan 12 01:02 DSC_0092.JPG -rw-r--r--. 1 root root 6.2M Jan 12 01:02 DSC_0091.JPG -rw-r--r--. 1 root root 5.9M Jan 12 01:02 DSC_0093.JPG
脚本如何工作?
命令行使用while循环进行解析,并将case语句和值分配给适当的变量。
$#是一个特殊变量,包含参数数量。 shift命令将命令参数向左移动一个位置。这样,每次发生移位时,我们都可以将下一个命令参数作为$1来访问,而不必使用$1,$2,$3等。
case语句类似于C编程语言中的switch语句。当大小写匹配时,将执行相应的语句。每个match语句以
;;
结尾。一旦将所有参数解析为变量percent
,scale
,source_dir
,ext
和dest_dir
之后,for循环将遍历源目录中的每个文件,并转换该文件。在for循环内进行了一些测试,以微调转换。
如果定义了变量ext(如果在命令参数中指定了-ext),则目标文件的扩展名将从source_file.extension更改为source_file。$ext。
如果提供了-dest参数,则通过将源路径中的目录替换为目标目录来修改目标文件路径。
如果指定了-scale或者-percent,则将resize参数(-resize widthx或者-resize perc%)添加到命令中。