商標公報の読み取りで OJPEGPostDecode のエラーが出る場合の対処法

特許庁の公報発行サイトからダウンロードした商標公報を Python + Pillow で処理しようとしたら

python3: tif_ojpeg.c:899: OJPEGPostDecode: Assertion `sp->libjpeg_session_active!=0' failed.

なエラーが発生して画像が読み込めない。これはそんな経験に対処した筆者の記録である。

商標公報の画像の拡張子は.IMGで、実態は TIFF ファイルです。
いろいろと調べてみると(経緯省略)、この TIFF ファイルに埋め込まれた画像が JPEG 形式なのですが、これの圧縮方式が Pillow (libtiff) でのエラーの原因になっていたようです。Old-Style とか言って、旧型式とのこと。

とりあえず Pillow (PIL.Image) で直接読み取るのは難しそうだったので、次の方法を試して解決しました。

  1. TIFF (.IMG) ファイルをバイナリーで直接読む
  2. TIFF 構造のタグから最初の画像のポインターとサイズを取得する
  3. 取得したポインターの位置まで進める
  4. そこから取得したサイズ分のデータを読み取る
  5. 読み取ったデータを Pillow (PIL.Image) で読み取る

こうすることで、最初から JPEG ファイルとして読み取られ、無事にエラーも解消しました。

参考にしたサイト