3

是否可以使用任何 *nix 程序(如“find”)或脚本语言(如 Python、PHP 或 Ruby)来搜索您的硬盘并找到所有具有相同宽度和高度(即正方形尺寸)的图像?

4

4 回答 4

6

下面的代码将递归列出指定路径上的文件,因此它可以查看您提到的特定硬盘上的所有子文件夹。它还将根据您可以指定的一组文件扩展名检查文件是否为图像。然后它将打印具有匹配宽度和高度的任何图像的文件名和宽度、高度。当您调用脚本时,您指定要在其下搜索的路径。下面显示了一个示例用法。

列表图像.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
于 2012-12-20T04:21:02.170 回答
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
于 2012-12-20T04:09:19.563 回答
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 4xargs这里使用了 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 重写,但由于它要么涉及使用 Python 的 ImageMagick 绑定或通过 调用它subprocess,所以我将其保留为 shell 命令的组合。

于 2012-12-20T14:12:07.183 回答
2

bash你可以通过使用这样的东西来获得图像大小:

identify -verbose jpg.jpg | awk '/Geometry/{print($2)}'

还阅读man findman identify

于 2012-12-20T04:32:34.480 回答