巨大なpng画像をjpegに変換しようとするとエラーになる

でかいpng画像をjpegに変換しようとするとエラーになる話。

変換しようとした画像は、101000 x 2400の画像。 $ identify sample.png

sample.png PNG 101000x2400 101000x2400+0+0 8-bit DirectClass 495MB 0.000u 0:00.000

convertコマンドを使って変換しようとすると、以下のようなエラーが出る。 $ convert sample.png sample.jpg

convert: Maximum supported image dimension is 65500 pixels sample.jpg @ error/jpeg.c/JPEGErrorHandler/297.

PHPのgd-jpegで変換しようとしても同じ。 $ php ./conv.php

PHP Warning: imagejpeg(): gd-jpeg: JPEG library reports unrecoverable error: in /home/ayskw/conv.php on line 7 Maximum supported image dimension is 65500 pixels

調べてみると、libjpeg-turboというライブラリの中で最大値が定義されているらしい。 Why does ImageMagick’s montage limit the JPG output to 65500 instead of 65535?

他の環境でも同じような制限がある。

Windows 上では JPEG ライブラリが 65500 pixels を超えるものは扱えないということか。考えてみたら jpg 使わずに gif とか png 使えばいいのねと試してみると、gif や png ならちゃんと描画できた

Python から Graphviz を使う - networkx & PyGraphviz、pydot など

これがJpegの仕様なのかどうかは不明だが、色々制限があるのでこのままだとダメっぽい。 ので、後処理をjpeg前提からpngでも実施できるように変更して問題を回避した。