如何按宽高比对图像进行排序
Posted
技术标签:
【中文标题】如何按宽高比对图像进行排序【英文标题】:How to sort images by aspect ratio 【发布时间】:2021-10-14 06:42:58 【问题描述】:我想按宽高比对图片进行排序,然后使用MPV浏览它们,我从谷歌得到了一些代码:
identify * |
gawk 'split($3,sizes,"x"); print $1,sizes[1]/sizes[2]' |
sed 's/\[.\]//' | sort -gk 2
这是一个输出:
28.webp 0.698404
1.webp 0.699544
27.webp 0.706956
10.webp 0.707061
25.webp 0.707061
9.webp 0.707061
2.webp 0.707241
22.webp 1.41431
23.webp 1.41431
24.webp 1.41431
然后我做了一些调整以适应我的需要:
identify * |
gawk 'split($3,sizes,"x"); print $1,sizes[1]/sizes[2]' |
sed 's/\[.\]//' | sort -gk 2 |
gawk 'print $1' |
mpv --no-resume-playback --really-quiet --playlist=-
它有效,但并不完美。它不能处理带空格的文件名,而且identify
比exiftool
慢,尤其是在处理WebP 格式时,此外,exiftool
有一个-r
选项,所以我想使用exiftool
来获得这个输出相反,但我不知道如何处理exiftool -r -s -ImageSize
的输出,有人可以帮助我吗?
【问题讨论】:
edit 你的问题要显示简洁、可测试的样本输入(如果是identify *
,则输出,而不是通过管道传输到你现有的 awk+sed 命令的输出,这些命令不能执行你想要的操作)以及在给定该输入的情况下您想要的最终预期输出。显然,如果您想从exiftool -r -s -ImageSize
输出而不是identify
输出开始,则显示该输出而不是identify *
的输出作为示例输入。
图片没有Exif信息怎么办?
【参考方案1】:
使用exiftool,您可以使用exiftool -p '$filename $ImageSize;m/(\d+)x(\d+)/;$_=$1/$2' /path/to/files | sort -gk 2
这将使输出的格式与您的示例相同,我假设相同的sort
命令可以使用它。如果没有,则需要编辑 sort
部分。
【讨论】:
【参考方案2】:使用identify
显示纵横比和图像文件名,无需额外计算
identify -format '%f %[fx:w/h]\n' *.jpg | sort -n -k2,2
file1.jpg 1
file2.jpg 1.46789
file6.jpg 1.50282
file5.jpg 1.52
file7.jpg 1.77778
file3.jpg 1.90476
关于identify
与exiftool
的性能,identify
的调用次数更少,但exiftool
看起来更快
strace -c identify -format '%f %[fx:w/h]\n' *.jpg 2>&1 | grep -E 'syscall|total'
% time seconds usecs/call calls errors syscall
100.00 0.001256 867 43 total
strace -c exiftool -r -s -ImageSize *.jpg 2>&1 | grep -E 'syscall|total'
% time seconds usecs/call calls errors syscall
100.00 0.000582 1138 311 total
【讨论】:
identify *
更慢,identify -format '%f %[fx:w/h]\n' *
最慢,这就是为什么我选择exiftool
并且任何图像都有ImageSize
info。以上是关于如何按宽高比对图像进行排序的主要内容,如果未能解决你的问题,请参考以下文章