Shell脚本来调整图像大小,在Linux中转换图像格式

时间:2020-01-09 10:37:32  来源:igfitidea点击:

我们所有人都从手机和相机中下载照片。在通过电子邮件发送图像或者将其发布到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语句以;;结尾。一旦将所有参数解析为变量percentscalesource_dirextdest_dir之后,for循环将遍历源目录中的每个文件,并转换该文件。

  • 在for循环内进行了一些测试,以微调转换。

  • 如果定义了变量ext(如果在命令参数中指定了-ext),则目标文件的扩展名将从source_file.extension更改为source_file。$ext。

  • 如果提供了-dest参数,则通过将源路径中的目录替换为目标目录来修改目标文件路径。

  • 如果指定了-scale或者-percent,则将resize参数(-resize widthx或者-resize perc%)添加到命令中。