iro*_*and 7 scripting imagemagick images
我在一个目录中有几个图像文件。这些图像大小相似,背景颜色相同。
如何通过添加像此附加图像这样的背景来使所有图像大小相同?

Gra*_*eme 10
这应该与所有工作的图像类型的ImageMagick可以处理,而不必指定*.png,*.jpg,*.jpeg等:
#!/bin/bash
images=$(identify -format '%f\n' * 2>/dev/null)
IFS=$'\n'
set -e
max_dims=$(
identify -format '%w %h\n' $images 2>/dev/null |
awk '($1>w){w=$1} ($2>h){h=$2} END{print w"x"h}'
)
orig_dir=originals_$(date +%Y-%m-%d_%T)
mkdir "$orig_dir"
mv -- $images "$orig_dir"
cd "$orig_dir"
set +e
for image in $images; do
convert -- "$image" -gravity Center -extent "$max_dims" "../$image"
done
Run Code Online (Sandbox Code Playgroud)
这会将原始图像移动到过时的目录中,以防结果不理想。此外,如果出于某种原因,图像文件的名称中有换行符,这将失败。
此脚本可以处理更多错误消息,以便在出现任何问题时提供有用的指示。但是现在,如果移动图像(set -e和之间的所有内容set +e)出现任何错误,脚本将退出。希望这将避免造成任何不可逆转的损害。
现在awk从@terdon 的回答中无耻地抄袭了脚本。
我借此机会提高了我的 bash 技能并想出了这个:
#!/bin/bash
maxx=0
maxy=0
# find largest dimension
for file in *.jpg ; do
dim=$(identify "$file" | awk '{ print $3 }')
xdim=$(echo $dim | cut -f1 -dx)
ydim=$(echo $dim | cut -f2 -dx)
if [ $xdim -gt $maxx ] ; then
maxx=$xdim
fi
if [ $ydim -gt $maxy ] ; then
maxy=$ydim
fi
done
mkdir bordered
# resize and store new images in new folder
for file in *.jpg ; do
dim=$(identify "$file" | awk '{ print $3 }')
xdim=$(echo $dim | cut -f1 -dx)
ydim=$(echo $dim | cut -f2 -dx)
xborder=$(( ($maxx - $xdim ) / 2 ))
yborder=$(( ($maxy - $ydim ) / 2 ))
convert "$file" -bordercolor black -border ${xborder}x${yborder} "bordered/$file"
done
Run Code Online (Sandbox Code Playgroud)
这应该可以解决问题:它首先循环遍历所有文件(根据您的需要进行更改)以找到最大的宽度和高度,然后再次循环以添加所需的边框(更改-bordercolor black部分以满足您的需要)。新文件存储在“bordered”文件夹中。
只要您选择的目标尺寸大于最大图像,您应该可以使用以下内容:
mogrify -gravity Center -extent 200x200 -background white -colorspace RGB *png
Run Code Online (Sandbox Code Playgroud)
上面的命令将更改原始文件,您可能需要在运行之前进行备份。它使用mogrifyImageMagick-extent 200x200通过添加白色背景 ( -background black) 并居中图像 ( -gravity Center)将当前目录中的所有 png 大小调整为 200x200px ( )。的-colorspace RGB需要,以避免类似的错误
mogrify.im6: Ignoring incorrect gAMA value when sRGB is also present `emacs-48x48.png' @ warning/png.c/MagickPNGWarningHandler/1754.
Run Code Online (Sandbox Code Playgroud)
为确保不会丢失任何图像数据,请确保您使用的尺寸大于或与您拥有的最大图像一样大。要快速获得,请尝试:
file *png | awk -F, '{print $2}' | sort -nu
Run Code Online (Sandbox Code Playgroud)
这应该打印排序后的所有图像的大小,您可以轻松找到最大的。
为了安抚金发姑娘 (:P),你可以自动化整个过程:
dimensions=$(file *png | cut -d, -f 2 | sort -u |
awk '($1>w){w=$1}($3>h){h=$3}END{print w"x"h}') &&
mogrify -gravity Center -extent $dimensions -background white -colorspace RGB *png;
Run Code Online (Sandbox Code Playgroud)