使用imagemagick通过shell脚本调整图像大小

jml*_*jml 0 bash imagemagick

我真的不太了解bash脚本或imagemagick,但我正在尝试创建一个脚本,您可以在其中为图像列表提供某种正则表达式匹配模式,然后将这些模式处理为具有给定文件名的新文件字首.

例如,给出以下目录列表:

allfiles01.jpg allfiles02.jpg allfiles03.jpg

我想像这样调用脚本:

./resisemany.sh allfiles*.jpg 30 newnames*.jpg
Run Code Online (Sandbox Code Playgroud)

最终的结果是你得到一堆新文件,新数字,数字匹配,

到目前为止我所拥有的是:

IMAGELIST=$1
RESIEZFACTOR=$2
NUMIMGS=length($IMAGELIST)

for(i=0; i<NUMIMGS; i++)
  convert $IMAGELIST[i] -filter bessel -resize . RESIZEFACTOR . % myfile.JPG
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助......我显然需要帮助的部分是1.如何给出一个匹配它理解的标准的bash脚本2.如何使用$ 2而不使它与图像列表中的第二项匹配3.如何获取图像列表的长度4.如何在这种情况下创建一个正确的for循环5.如何为shell命令进行正确的文本替换,以便按照我的提示附加项目.

JML

Dav*_*d Z 6

标准程序的工作方式可能是采用"in"文件名模式和"out"文件名模式,并对当前目录中与"in"模式匹配的每个文件执行操作,将适当的部分替换为"出"模式.如果你有一个硬编码的模式,当你可以编写像这样的一次性命令时,这很容易

for infile in *.jpg; do convert $infile -filter bessel -resize 30% ${infile//allfiles/newnames}; done
Run Code Online (Sandbox Code Playgroud)

但是,为了制作一个可以用任何模式执行此操作的脚本,您需要更复杂的东西,因为您的文件名转换可能比仅用一个部件替换另一个部件更复杂.不幸的是,Bash并没有真正为您提供一种方法来识别文件名的哪个部分与模式的特定部分匹配,因此您必须使用功能更强大的正则表达式引擎,sed例如:

#!/bin/bash

inpattern=$1
factor=$2
outpattern=$3
for infile in *; do
    outfile=$(echo $infile | sed -n "s/$inpattern/$outpattern/p")
    test -z $outfile && continue
    convert $infile -filter bessel -resize $factor% $outfile
done
Run Code Online (Sandbox Code Playgroud)

这可以作为

./resizemany.sh 'allfiles\(.*\).jpg' 30 'newnames\1.jpg'
Run Code Online (Sandbox Code Playgroud)

(注意单引号!),它会调整allfiles1.jpgnewnames1.jpg等于是你会风基本上需要学习sed的正则表达式语法指定您进出模式.(这不是那么糟糕,真的)


小智 5

如果您创建了要处理的所有文件的文件夹,则可以消除正则表达式问题,然后执行以下操作:

for img in `ls *.jpg`
do
  convert $img -filter bessel -resize 30% processed-$img
done
Run Code Online (Sandbox Code Playgroud)

然后,如果您以后需要重命名它们,您可以执行以下操作:

ls | nl -nrz -w2 | while read a b;  do mv "$b" newfilename.$a.jpg; done;
Run Code Online (Sandbox Code Playgroud)

此外,如果您正在进行相同操作的批处理,您可能会看到使用mogrify是否有帮助(imagemagik的转换多个文件的方法).与上面的示例一样,制作文件夹的副本,然后运行任何处理以便不破坏原始文件总是好的.