Answers:
使用NN的ImageMagick注释作为线索,事实证明您可以将其作为-format
输出的一部分进行任意计算。因此,一种可能的方法是:
identify -format "%[fx:round(100000*abs((4/3)-(w/h)))]:%M\n" *.jpg | \
sort -n -k1 -t:
应该做你想做的。请注意,其中的4/3是恒定的所需纵横比。您当然可以找到它作为前一个的输出identify
(以匹配“最接近该图像”)。
为说明起见,我们以期望的宽高比与实际的宽高比为准。然后乘以大数并四舍五入。乘法和舍入是因为sort仅处理整数,而不处理有理数。
事实证明sort
确实似乎在做理性,而不仅仅是整数。它甚至在Single Unix Specification(v4)中指定。因此,您可以摆脱该变通办法:
identify -format "%[fx:abs((4/3)-(w/h))]:%M\n" *.jpg | \
sort -n -k1 -t:
33333:cover.jpg
cover.jpg是500x500。
好吧,最简单的方法是使用ImageMagick。对于基于debian的系统,它应该在Linux发行版的存储库中,运行:
sudo apt-get install imagemagick
ImageMagick套件的程序之一是identify
,它将打印输入图像文件列表的特征。结合使用它sort
会为您提供按大小排序的图像列表(您可以为具有的任何扩展名更改png:
identify *png | sort -gk 3
如果您实际上需要的是长宽比,而不仅仅是尺寸,请尝试以下操作:
简单的选择,假设您的图像名称没有空格:
identify *png *jpg *gif | \
gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' | \
sed 's/\[.\]//' | sort -gk 3
gawk命令将第三个字段(具有LxH格式的图像大小)拆分为数组“大小”,然后打印第一个字段(图像名称)以及将图像长度除以其高度的结果。该sed
命令只是美化输出,该sort
命令根据图像大小比率对结果进行排序。
更复杂的是,这可以处理文件名中的空格:
find . \( -iname "*png" -o -iname "*jpg" -o -iname "*gif" \) -exec identify {} \; |\
perl -ne '/(.+?)\s+[A-Z]{3}\s+(\d+)x(\d+)/; print "$1 ", $2/$3, "\n"' | \
sort -gk 2
在这里,我们find
用来标识我们感兴趣的文件并运行identify
命令,然后通过一个小的PERL脚本来传递其输出。正则表达式查找三个大写字母([A-Z]{3}
),它们应该是图像格式。一旦发现,就很容易识别图像名称和尺寸。
我在这里不使用gawk,因为输入文件名中空格的存在会混淆字段编号。最后,脚本将打印出图像的名称以及我们用sort
数字表示的长度/高度除法的结果。
如果仅浏览可用的长宽比还不够,如果您至少有一张具有所需长宽比的图像,则只需使用grep提取那些最接近长宽比的图像:
identify *png *jpg *gif | \
gawk '{split($3,sizes,"x"); print $1,sizes[1]/sizes[2]}' |\
sed 's/\[.\]//' | sort -gk 3 | grep -C 10 GOOD_IMAGE.jpg
您可以使用参考来计算每个纵横比的差。看起来像derobert的答案,但更简单:
ref=4/3
identify -format "%[fx:abs(w/h - $ref)] %M\n" *.jpg | sort -n -k1
长宽比只是一个数字,因此如果名称以长宽比为前缀,则可以根据图像名称浏览图像。通过在宽高比前面添加符号链接,您可以浏览按宽高比排序的图像。
以下观看者按预期工作。(即使是真实图像,feh也不会前进/后退-在我的系统上)
picd='/media/dat_ext4/pictures/jpg/misc'
srtd="$picd/ar-sort" # directory to hold "sorted" symbolic links
mkdir -p "$srtd"
find "$picd" -maxdepth 1 -type f -name "*" -print0 |
while IFS= read -d $'\0' -r file ; do
[[ $(file -ib "$file") != image* ]] && continue # skip non-image files
ar="$(identify -format "%[fx:w/h]" "$file")"
slink="$(printf '%s/%06.4f %s' "$srtd" "$ar" "$(basename "$file")")"
# make symbolic link in 'ar-sort' directory
ln -s "$file" "$slink"
echo "$slink"
done
进入ar-sort
目录,然后从您感兴趣的任何起点(长宽比)进行浏览。
符号链接名称如下所示:
0.6732 Gold Bars.jpg
0.7242 Light Bulb.jpg
0.8022 Escher - Waterfall.jpg
1.3696 Old Typewriter.jpg
1.6000 King Tut.jpg
我通常的推理思路是在听到“接近度”的地方使用平方误差距离度量。当然可以使用绝对值,这会更快。该脚本将理想的宽高比作为参数,处理当前目录中的所有* .jpg文件,并按照与理想宽高比的增大顺序输出它们。
head
删除ImageMagick插入的行尾字符。
该脚本包含一个gawk命令,该命令将输出字段分隔符设置为不太可能的字符,计算平方差并打印回对差名。执行排序,并通过剔除不必要的信息(纵横比之差)cut
。
#!/bin/sh
if [ x"$1" = "x" ] ; then
echo "Usage: $0 TargetAspectRatio" >&2
exit 2
fi
ASPECT_CMD="BEGIN{OFS=\"|\";}\
{\
print (\$1-$1)^2, \$2;\
}"
identify -format "%[fx:w/h]:%M\n" *.jpg | head -n-1 | gawk -F":" "$ASPECT_CMD" | sort -k1 -t"|" | cut -f2 -d"|"
identify -format "%[fx:w/h]:%M\n" *.jpg
。我不知道如何根据任意值的接近程度轻松进行排序。sort
似乎不支持这种排序。