Python
Python3

【Python】imghdrでJPEGファイルが正しく判定されない


はじめに

画像形式の取得には imghdr というパッケージが便利なのですが、たまにjpgファイルが正しく判定されないので困ってました。

うまく判定されない画像の例

ドラえもんの画像 1

ドラえもんの画像 2


imghdr

imghdrのソースコードを覗いてみると、jpgの判定は以下の関数で行っていることがわかります。

def test_jpeg(h, f):

"""JPEG data in JFIF or Exif format"""
if h[6:10] in (b'JFIF', b'Exif'):
return 'jpeg'

どうやら、判定がうまく行かなかったファイルでは'JFIF'や'Exif'が正しい位置にはなかったようです。


解決方法

jpgファイルには、ファイル先頭が必ず FFD8 で始まる、というお約束があるのでそれを利用します。(なぜ imghdr がこの方法を取らないのかは気になるところです。)

def is_jpg(byte):

return byte[:2] == b'\xff\xd8'

短すぎて関数化する必要無い気もしますが、とりあえずこれでjpgファイルが正しく判定できるようになりました。