ファイルが有効な画像ファイルかどうかを確認するにはどうすればよいですか?
-
23-08-2019 - |
質問
現在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'
モジュール
同様の機能を再実装するよりもはるかに優れている使い方ブライアンはあなたがPILの検証を使用することができます示唆されているものに加え、 >ファイルが壊れているかどうかを確認する方法。
im.verify()
ファイルがあるかどうかを判断しようとすると、 実際に復号化することなく、壊れました 画像データ。この方法は、任意のを発見した場合 問題、それは、適切な引き上げ 例外。このメソッドは、のみで動作します 新しくオープンした画像。画像がある場合 すでにロードされて、結果があります 未定義。また、あなたはロードする必要がある場合 この方法を使用した後の画像、あなた 画像ファイルを再度開く必要があります。属性
Linuxでは、あなたのpython-魔法を使用することができます(のhttp://pypi.pythonファイル形式を識別するためのlibmagic使用.ORG /は、PyPI /パイソン・マジック/ 0.1 に)。
私の知る限り、libmagicのは、ファイルの中に見て、あなたが「妥当性」のための表面的なテストとしてこれを見るかもしれない..だから、ビットマップのサイズ、フォーマットのバージョンなどのように、あなただけの形式よりも、それについての詳細を教えしようとします。
「有効」の他の定義については独自のテストを記述する必要があります。
あなたは、その後、libmagicののpython-魔法とするPythonバインディングを使用することができますMIMEタイプを確認してください。これは、ファイルが破損またはインタクトたかどうかを教えてくれませんが、それは、画像の種類を決定することができるはずです。
まあ、私はPSDの内部のことは知らないが、私は、確かに、実際の問題として、SVGは、画像ファイルそのものではない、ということを知っている - それは、XMLに基づいており、それがあるので、基本的に、プレーンテキストファイルます。
アップデート
また、Python スクリプトに次のソリューションを実装しました ここGitHubにあります.
また、破損したファイル (jpg) は「壊れた」画像ではないことが多いことも確認しました。つまり、破損した画像ファイルが正当な画像ファイルのままである場合があり、元の画像が失われたり変更されたりしても、エラーなしで読み込むことができます。ただし、ファイルの切り捨てにより常にエラーが発生します。
更新の終了
Pythonを使用できます 枕(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 つだと思います)。このコードを使用して、標準の Pillow では約 10 MB/秒、または Pillow-SIMD モジュール (最新の 2.5 Ghz x86_64 CPU) では 40 MB/秒で一連の画像を検証します。
他の形式の場合 psd,xcf、..使用できます イメージマジック ラッパー ワンド, 、コードは次のとおりです。
im = wand.image.Image(filename=filename)
temp = im.flip;
im.close()
しかし、私の実験によると、Wand は切り詰められた画像を検出しません。プロンプトを表示せずに、欠けている部分を灰色の領域として読み込むと思います。
私はそれを赤にしました イメージマジック 外部コマンドがあります 識別する それ できた ジョブを作成しますが、その関数をプログラムで呼び出す方法が見つからず、このルートをテストしていません。
常に事前チェックを実行することをお勧めします。 ファイルサイズ ゼロでない(または非常に小さい)ことは、非常に重要です。 安い アイデア:
statfile = os.stat(filename)
filesize = statfile.st_size
if filesize == 0:
#manage here the 'faulty image' case
でしょうが受け入れられるファイル拡張子をチェックしたり、あなた自身がイメージファイルを表すデータを確認しようとしている?
あなたは、ファイルの拡張子を確認することができた場合は、正規表現または単純な比較は、要件を満たすことができます。
またPIL
イメージにあなたも、このようなファイル名の拡張子のチェックを追加することができます確認します:
filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif'))
あなたはさらにPIL
または他で提案されているライブラリのいずれかを使用する必要がある理由ファイル名が有効なイメージの拡張子を持つこののみをチェックした場合、それは実際にそれが有効なイメージだかどうかを確認するために、画像を開いていないことに注意してください、それはです答えます。