こんにちは、なかわけです。
今日はPostgresのpg_lo_exportの話です。
仕事で大量のラージオブジェクトLarge Objectをファイルに書き出す処理をしました。大量にあったので全部できるか心配だったのですが、無事全部書き出すことができました。めでたしめでたし。
・・・ではありませでした。
書き出されたいくつかの画像ファイルに不要データが追加されてしまってファイル容量が異常に膨らんでいました。もうちょっと詳しく説明しますとjpegファイルにはマーカーというデータを区切る目印があるのですが、EOI(End of Image)マーカーの後ろに不要なデータが存在しました。EOIマーカーの後ろに不要データがくっついていても画像ファイルとしては絵が見れるのでファイルサイズを比較するまで気づかなかったというわけです。おそらくpg_lo_exportの際に何かに失敗して不要データがくっついてしまったようです。
2度同じラージオブジェクトをpg_lo_exportしたのですが、同じように不要データがくっついてしまいます。どうやら元々のラージオブジェクトのデータブロックに問題があったようです。データブロックをどうこうするのは大変だと思ったので、書き出された画像ファイルを調整するようにしました。
そこで今回はImageMagickを使用しました。コマンドは以下のような感じです
convert -sample 100%x100% 元ファイル名 処理後のファイル名
この処理はピクセル数を変更せずに元ファイルから画像データだけ抽出して別ファイルに保存しています。この処理を問題の画像ファイルにババッと掛けた事でデータを正しく修正しました。めでたしめでたし。
・・・本当は、pg_lo_exportの際になぜ不要データがくっついてしまったかを調べるべきかと思いましたが、Postgresの環境の問題や今後ラージオブジェクトは使用しないだろうということで今回はここまでにしておきましたー。
Tags: ImageMagick, pg_lo_export, Postgres