3

「find」などの *nix プログラムや、Python、PHP、Ruby などのスクリプト言語を使用して、HDD を検索し、同じ幅と高さ (正方形の寸法) を持つすべての画像を見つけることができますか?

4

4 に答える 4

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
于 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

これは 1 つのシェル行で実行できますが、お勧めしません。2 つのステップでそれを行います。まず、ファイル内のすべての画像ファイルと必要な属性を収集します。

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ます。identifyここでは、多くのフォーマットを認識するImageMagickを使用しました。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、シェル コマンドの組み合わせとして残しました。

于 2012-12-20T14:12:07.183 に答える
2

bashのようなものを使用して画像サイズを取得できます。

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

また、読んman findで、man identify

于 2012-12-20T04:32:34.480 に答える