はじめに
画像形式の取得には 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ファイルが正しく判定できるようになりました。