でかいpng画像をjpegに変換しようとするとエラーになる話。
変換しようとした画像は、101000 x 2400の画像。
$ identify sample.png
sample.png PNG 101000×2400 101000×2400+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 ならちゃんと描画できた
これがJpegの仕様なのかどうかは不明だが、色々制限があるのでこのままだとダメっぽい。
ので、後処理をjpeg前提からpngでも実施できるように変更して問題を回避した。