PIL.UnidentifiedImageError: cannot identify image file

Python
本ページはプロモーションが含まれています

はじめに

今回はPythonのPython Imaging Library (PIL)を利用していたときに発生したエラーについてです。
画像読み込みをしているときにエラーに遭遇したのですが、その時のエラーの原因と対処法、サンプルプログラムなどを載せているので参考にしていただければと思います。

エラーの原因と対処法

エラー

まず発生したエラーですが、

PIL.UnidentifiedImageError: cannot identify image file ****

というものです(****部分は任意の値になります。)
日本語で訳すと
「画像ファイル ****を識別できません」
となります

原因とサンプルソース

原因

このエラーは通常、Python Imaging Library (PIL)またはそのフォークであるPillowを使用して、読み込み可能な形式ではない画像ファイルを読み込もうとした場合、または画像ファイルが破損している場合、または指定されたパスに画像ファイルが存在しない場合に発生します。

ファイルが破損している場合などでファイルを開くときに起きるエラーと思っていただければと思います。
具体的な例を見てみましょう。

エラーが発生するソースコード

前提として、ソースコードがある階層にdownloaded_images/corrupted_or_unsupported.jpgがあるものとします。
またcorrupted_or_unsupported.jpgはファイルが壊れている(テキストファイルを無理やりjpg形式に等にしてみてください)ものとします。

from PIL import Image

try:
    # 非対応の形式や破損した画像ファイルを開こうとする
    img = Image.open('downloaded_images/corrupted_or_unsupported.jpg')
except PIL.UnidentifiedImageError:
    print('画像ファイルが破損しているか、非対応の形式です')

これを実行すると

PIL.UnidentifiedImageError: cannot identify image file 'downloaded_images/corrupted_or_unsupported.jpg'

とエラーになります。

修正したソースコード

修正したコードは事前にTry exceptで例外処理を入れています。

from PIL import Image
from PIL import UnidentifiedImageError

try:
    img = Image.open('downloaded_images/corrupted_or_unsupported.jpg')
except UnidentifiedImageError:
    print("画像ファイルが破損しているか、予期しない形式の可能性があります。")

2行目ではUnidentifiedImageErrorを想定しているので、exceptとしてキャッチするために新たにImport処理を追加しています。
(Pythonのエラーハンドリングでは、特定のエラータイプを指定してそれをキャッチすることが一般的です。エラータイプを指定することで、プログラムが遭遇する可能性のある特定の問題を対象として例外処理を書くことができるためです)

そして実際Exceptionが発生した場合(ファイルが損傷していたりして問題があるなど)は例外処理によってコメントを表示するようにしています。

エラーが発生するソースと同じ状況でコードを実行すると、

画像ファイルが破損しているか、予期しない形式の可能性があります。

となります。
またファイルに問題ない場合はTryの中の処理が実行されます。

さいごに

今回はPythonのPython Imaging Library (PIL)したときにファイルが破損していた際に起きたエラーについてでした。
画像も必ずファイルが正常とは限らないのでこうした処理をいれるのが良いかと思います。
特自分でAIなどで画像を生成した場合なんかはこうした処理を入れるのが良いかと思います。

この記事がお役に立ったのなら嬉しいです。
最後までお読みいただきありがとうございます。

Ads Blocker Image Powered by Code Help Pro

Ads Blocker Detected!!!

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました