「find」などの *nix プログラムや、Python、PHP、Ruby などのスクリプト言語を使用して、HDD を検索し、同じ幅と高さ (正方形の寸法) を持つすべての画像を見つけることができますか?
4 に答える
以下のコードは、指定されたパス上のファイルを再帰的にリストするため、言及したように特定のハードディスク上のすべてのサブフォルダーを調べることができます。また、指定できる一連のファイル拡張子に基づいて、ファイルが画像であるかどうかもチェックします。次に、幅と高さが一致する画像のファイル名と幅、高さを出力します。スクリプトを呼び出すときは、検索するパスを指定します。使用例を以下に示します。
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
それは確かに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
これは 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
、シェル コマンドの組み合わせとして残しました。
次bash
のようなものを使用して画像サイズを取得できます。
identify -verbose jpg.jpg | awk '/Geometry/{print($2)}'
また、読んman find
で、man identify