私は現在PILを使用しています。
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
ただし、これでほとんどのケースが十分カバーされますが、xcf、svg、psdなどの一部のイメージファイルが検出されません。PsdファイルはOverflowError例外をスローします。
それらを含めることもできますか?
私は現在PILを使用しています。
from PIL import Image
try:
im=Image.open(filename)
# do stuff
except IOError:
# filename not an image file
ただし、これでほとんどのケースが十分カバーされますが、xcf、svg、psdなどの一部のイメージファイルが検出されません。PsdファイルはOverflowError例外をスローします。
それらを含めることもできますか?
回答:
多くの場合、最初の数文字はさまざまなファイル形式のマジックナンバーになります。上記の例外チェックに加えて、これをチェックできます。
組み込みのimghdrモジュールを見つけました。Pythonのドキュメントから:
imghdrモジュールは、ファイルまたはバイトストリームに含まれる画像のタイプを決定します。
これはどのように機能するかです:
>>> import imghdr
>>> imghdr.what('/tmp/bass')
'gif'
モジュールの使用は、同様の機能を再実装するよりもはるかに優れています
imghdr.what(path)返されます。現在認識されている画像タイプのリスト:rgb、gif、pbm、pgm、ppm、tiff、rast、xbm、jpeg、bmp、png、webp、exr。Nonepath
ブライアンの提案に加えて、PILの検証メソッドを使用して、ファイルが破損しているかどうかを確認できます。
im.verify()
実際に画像データをデコードせずに、ファイルが壊れているかどうかを判断しようとします。このメソッドで問題が見つかった場合は、適切な例外が発生します。このメソッドは、新しく開いた画像でのみ機能します。画像がすでにロードされている場合、結果は未定義です。また、このメソッドを使用した後にイメージをロードする必要がある場合は、イメージファイルを再度開く必要があります。の属性
PIL画像チェックに加えて、次のようにファイル名拡張子チェックを追加することもできます:
filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))
これは、ファイル名に有効な画像拡張子があるかどうかを確認するだけであり、実際に画像を開いて有効な画像であるかどうかを確認しないことに注意してください。そのため、追加PILまたは他の回答で提案されているライブラリのいずれかを使用する必要があります。
from PIL import Image img = Image.open(filename) print(img.format)、その後、このようにそれを確認しますimg.format.lower() in ['png', 'jpg', 'jpeg', 'tiff', 'bmp', 'gif']
更新
また、GitHubの Pythonスクリプトに次のソリューションを実装しました。
破損したファイル(jpg)が頻繁に「壊れた」画像ではないことも確認しました。つまり、破損した画像ファイルが正当な画像ファイルとして残る場合があり、元の画像が失われたり変更されたりしても、エラーなしで読み込むことができます。ただし、ファイルの切り捨てにより常にエラーが発生します。
更新を終了
あなたはPythonを使うことができます ほとんどの画像形式で Pillow(PIL)モジュールを使用して、ファイルが有効で完全な画像ファイルであるかどうかを確認できます。
壊れた画像も検出することを目的とする場合、@ Nadia Alramliは正しくim.verify()方法を提案しますが、これはすべての起こり得る画像の欠陥を検出するわけではありません、例えば、im.verify(ほとんどの視聴者は多くの場合、灰色のエリアにロードすること)切り捨てられた画像を検出しません。
枕もこれらのタイプの欠陥を検出できますが、画像操作または画像デコード/再コード化を適用するか、チェックをトリガーする必要があります。最後に、このコードを使用することをお勧めします:
try:
im = Image.load(filename)
im.verify() #I perform also verify, don't know if he sees other types o defects
im.close() #reload is necessary in my case
im = Image.load(filename)
im.transpose(PIL.Image.FLIP_LEFT_RIGHT)
im.close()
except:
#manage excetions here
画像に欠陥がある場合、このコードは例外を発生させます。im.verifyは、画像操作を実行するよりも約100倍高速であることを考慮してください(フリップは安価な変換の1つだと思います)。このコードを使用して、標準の枕で約10メガバイト/秒、または枕-SIMDモジュール(最新の2.5 GHz x86_64 CPU)で40メガバイト/秒で一連の画像を検証します。
他の形式のpsd、xcf、...の場合、ImagemagickラッパーWandを使用できます。コードは次のとおりです。
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
しかし、私の実験では、ワンドは切り詰められた画像を検出しないため、プロンプトなしで灰色の領域として不足しているパーツをロードすると思います。
Imagemagickに、ジョブを作成できる外部コマンドの識別があることを知らせましたが、その関数をプログラムで呼び出す方法が見つからず、このルートをテストしていません。
私はいつも事前チェックを実行することをお勧め、チェックファイルサイズをゼロ(または非常に小さい)ではないと、非常にある安価なアイデア:
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case
Linuxでは、libmagicを使用してファイル形式を識別するpython-magic(http://pypi.python.org/pypi/python-magic/0.1)を使用できます。
申し訳ありませんが、libmagicはファイルを調べて、ビットマップの寸法、フォーマットのバージョンなど、フォーマットだけではなく、それについてより多くのことを伝えようとします。したがって、これは「有効性」の表面的なテストと見なされる場合があります。
「有効」の他の定義については、独自のテストを作成する必要がある場合があります。
libmagic、python-magicへのPythonバインディングを使用して、mimeタイプを確認できます。これにより、ファイルが破損しているか完全な状態であるかはわかりませんが、ファイルの種類を特定できるはずです。
1つのオプションは、filetypeパッケージを使用することです。
取り付け
python -m pip install filetype
メリット
ソリューション例
import filetype
filename = "/path/to/file.jpg"
if filetype.image(filename):
print(f"{filename} is a valid image...")
elif filetype.video(filename):
print(f"{filename} is a valid video...")
公式リポジトリの追加情報:https : //github.com/h2non/filetype.py
ファイル拡張子の確認は許容できるでしょうか、それともデータ自体が画像ファイルを表すことを確認しようとしていますか?
ファイル拡張子を確認できる場合は、正規表現または単純な比較で要件を満たすことができます。
format = [".jpg",".png",".jpeg"]
for (path,dirs,files) in os.walk(path):
for file in files:
if file.endswith(tuple(format)):
print(path)
print ("Valid",file)
else:
print(path)
print("InValid",file)