是否可以使用任何* nix程序,如'find'或Python,PHP或Ruby等脚本语言,可以搜索您的硬盘并查找所有具有相同宽度和高度的图像,即方形尺寸?
答案 0 :(得分:6)
下面的代码将以递归方式列出指定路径上的文件,因此它可以查看您提到的特定硬盘上的所有子文件夹。它还将根据您可以指定的一组文件扩展名检查文件是否为图像。然后它将打印具有匹配宽度和高度的任何图像的文件名和宽度,高度。当您调用脚本时,您可以指定要在其下搜索的路径。示例用法如下所示。
<强> listimages.py 强>
import PIL.Image, fnmatch, os, sys
EXTENSIONS = ['.jpg', '.bmp']
def list_files(path, extensions):
for root, dirnames, filenames in os.walk(path):
for file in filenames:
if os.path.splitext(file)[1].lower() in extensions:
yield os.path.join(root, file)
for file in list_files(sys.argv[1], EXTENSIONS):
width, height = PIL.Image.open(file).size
if width == height:
print "found %s %sx%s" % (file, width, height)
<强>使用强>
# listimages.py /home/user/myimages/
found ./b.jpg 50x50
found ./a.jpg 340x340
found ./c.bmp 50x50
found ./d.BMP 50x50
答案 1 :(得分:5)
使用Python肯定是可能的。
您可以使用os.walk来遍历文件系统,并使用PIL检查图像是否在两个方向上具有相同的尺寸。
import os, Image
for root, dir, file in os.walk('/'):
filename = os.path.join(root, file)
try:
im = Image.open(filename)
except IOError:
continue
if im.size[0] == im.size[1]:
print filename
答案 2 :(得分:2)
在bash
中,您可以使用以下内容获取图片大小:
identify -verbose jpg.jpg | awk '/Geometry/{print($2)}'
另请阅读man find
和man identify
答案 3 :(得分:2)
这可以在一个shell行中完成,但我不建议这样做。分两步完成。首先,收集文件中的所有图像文件和所需属性:
find . -type f -print0 | xargs -J fname -0 -P 4 identify \
-format "%w,%h,%m,\"%i\"\n" fname 2>|/dev/null | sed '/^$/d' > image_list
sed
只是为了删除生成的空白行。您可能需要调整系统-P 4
中的参数xargs
。在这里,使用了ImageMagick的identify
,因为它识别了很多格式。这将创建一个名为image_list
的文件,该文件采用典型的CSV格式。
现在只需根据您的需要过滤image_list
即可。为此我更喜欢使用Python,如下所示:
import sys
import csv
EXT = ['JPEG', 'PNG']
for width, height, fformat, name in csv.reader(open(sys.argv[1])):
if int(width) == int(height) and width:
# Show images with square dimensions, and discard
# those with width 0
if fformat in EXT:
print name
这个答案的第一部分可以很容易地用Python重写,但由于它要么使用ImageMagick绑定Python或通过subprocess
调用它,我把它作为shell命令的组合。