Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonで画像ファイルの種類を判定する方法|imghdrモジュールの使い方

この記事では、Pythonを使って画像ファイルの種類をプログラム的に判定する方法を解説します。例えば、1つのディレクトリに数百枚の画像ファイルがあり、その中からJPEGなど特定の形式のファイルだけを抽出したい場面を考えてみましょう。こうした処理は、Pythonのライブラリ「imghdr」を使えば簡単に実現できます。

imghdrは、ファイルまたはバイトストリームに含まれる画像の種類を判定するためのパッケージです。

インストール

Python 3.6以降を使用している場合、imghdrは標準ライブラリとして同梱されているため、多くの場合は別途インストールを行う必要はありません。

もしインストールが必要な場合は、コマンドターミナルで以下のコマンドを実行してください。

pip install imghdr

インストール後、Pythonシェルでモジュールをインポートしてみてください。エラーが表示されなければ、正しくインストールされています。

>>> import imghdr
>>>

構文

imghdrパッケージでは、次の関数が定義されています。

imghdr.what(filename[, h])

引数の説明

  • filename:指定したファイル名の画像データを検査し、画像の種類を表す文字列を返します。

  • h:省略可能な引数です。hが指定された場合はfilenameが無視され、hに含まれるバイトストリームが検査対象となります。

imghdrパッケージが認識できる画像形式は以下の通りです。

戻り値
画像フォーマット
'rgb'
SGI ImgLibファイル
'gif'
GIF 87a / 89aファイル
'pbm'
Portable Bitmapファイル
'pgm'
Portable Graymapファイル
'ppm'
Portable Pixmapファイル
'tiff'
TIFFファイル
'rast'
Sun Rasterファイル
'xbm'
X Bitmapファイル
'jpeg'
JFIFまたはExif形式のJPEGデータ
'bmp'
BMPファイル
'png'
Portable Network Graphics(PNG)

さらに、対応する変数に関数を追加することで、imghdrが認識できるファイル形式のリストを独自に拡張することも可能です。

imghdr.testsについて

imghdr.testsには、個々の検査を実行する関数のリストが格納されています。各関数は「バイトストリーム」と「開かれたファイルライクオブジェクト」の2つの引数を受け取ります。ただし、what()がバイトストリームを指定して呼び出された場合、ファイルライクオブジェクトにはNoneが渡されます。

テスト関数は、判定に成功した場合は画像の種類を文字列として返し、失敗した場合はNoneを返します。

>>> import imghdr
>>> imghdr.what('clock.jpg')
'jpeg'

実用例:ダウンロード画像の拡張子を自動判定

以下は、imghdrの具体的な実装例の一つです。URLから画像をダウンロードし、実際のファイル形式を判定して適切な拡張子を付与します。画像として認識できないファイルは自動的に削除される仕組みです。

def identify_filetype(url, imageName, folderName):
   session = _setupSession()
   try:
      # タイムアウト値も調整可能なパラメータ
      image = session.get(url, timeout = 5)
      with open(os.path.join(folderName, imageName),'wb') as fout:
      fout.write(image.content)
      fileExtension = imghdr.what(os.path.join(folderName, imageName))
      if fileExtension is None:
         os.remove(os.path.join(folderName, imageName))
      else:
         newName = imageName + '.' + str(fileExtension)
         os.rename(os.path.join(folderName, imageName), os.path.join(folderName, newName))
except Exception as e:
print ("failed to download one pages with url of " + str(url))

注意点:新しいPython環境での利用について

なお、imghdrモジュールはPython 3.11で非推奨(Deprecated)となり、Python 3.13では標準ライブラリから削除されました。最新のPython環境で同様の機能が必要な場合は、「filetype」や「Pillow」などのサードパーティ製ライブラリの利用を検討するとよいでしょう。

  1. OpenCVを使って画像・動画のエッジを検出するPythonプログラムの書き方

    この記事では、Pythonを使って画像や動画ファイルからエッジ(輪郭)を検出する方法を解説します。エッジ検出には、コンピュータビジョン向けに設計されたオープンソースライブラリ「OpenCV」を使用します。OpenCVはもともとIntelによって開発されたライブラリで、BSDライセンスのもとで無料で利用できます。OpenCVの機能を使うには、pipでインストールを行います。インストール時にNumPyモジュールも自動的にダウンロードされるため、別途用意する必要はありません。sudo pip3 install opencv-python今回の入力には動画ファイルを使用しますが、Webカメラを接続すれ

  2. Pythonでフォトモザイクを実装する方法をわかりやすく解説

    フォトモザイク(Photomosaic)とは、1枚の画像を正方形のグリッドに分割し、その各マスを別の画像や色のブロックに置き換える技法です。離れた場所から見ると元の画像がはっきりと見えますが、近づいて観察すると、さまざまな色の小さなブロックが集まって構成されていることが分かります。この記事では、Pythonの「photomosaic」というモジュールを使って、簡単にフォトモザイク画像を作成する方法をご紹介します。photomosaicモジュールのインストールまずは以下のコマンドでphotomosaicモジュールをインストールします。依存関係としてscikit-learnモジュールも同時にダウン