我的目录中有几个图像文件。这些图像大小相似且背景颜色相同。
如何通过添加像所附图像这样的背景来使所有图像大小相同?
答案1
这应该适用于 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
这会将原始图像移动到一个过时的目录中,以防结果不理想。此外,如果出于某种原因图像文件的名称中包含换行符,则此操作将会失败。
该脚本可以处理更多错误消息,以便在出现问题时提供有用的指示。但目前,如果移动图像时出现任何错误(set -e
和之间的所有内容set +e
),脚本将退出。希望这将避免造成任何不可逆转的损害。
更新
现在awk
剧本无耻地抄袭了@terdon的回答。
答案2
只要您选择的目标尺寸大于最大图像,您就应该可以接受以下操作:
mogrify -gravity Center -extent 200x200 -background white -colorspace RGB *png
上面的命令会改变原来的文件,您可能需要在运行之前进行备份。它使用ImageMagick通过添加白色背景 ( ) 并将图像居中 ( )mogrify
将当前目录中的所有 png 大小调整为 200x200 像素 ( ) 。需要避免类似的错误-extent 200x200
-background black
-gravity Center
-colorspace RGB
mogrify.im6: Ignoring incorrect gAMA value when sRGB is also present `emacs-48x48.png' @ warning/png.c/MagickPNGWarningHandler/1754.
为了确保您不会丢失任何图像数据,请确保您使用的尺寸大于或与您拥有的最大图像一样大。要快速获得该结果,请尝试:
file *png | awk -F, '{print $2}' | sort -nu
这应该打印所有排序图像的大小,您可以轻松找到最大的图像。
为了安抚金发姑娘 (: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;
答案3
我借此机会提高了我的 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
这应该可以解决问题:它首先循环遍历所有文件(根据您的需要进行更改)以找到最大的宽度和高度,然后再次循环以添加所需的边框(更改部分-bordercolor black
以满足您的需要)。新文件存储在“bordered”文件夹中。