特許庁の公報発行サイトからダウンロードした商標公報を 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) で直接読み取るのは難しそうだったので、次の方法を試して解決しました。
- TIFF (.IMG) ファイルをバイナリーで直接読む
- TIFF 構造のタグから最初の画像のポインターとサイズを取得する
- 取得したポインターの位置まで進める
- そこから取得したサイズ分のデータを読み取る
- 読み取ったデータを Pillow (PIL.Image) で読み取る
こうすることで、最初から JPEG ファイルとして読み取られ、無事にエラーも解消しました。