フレームワークとは直接関係ないですが、Codeigniter で構築しているサイトで画像のリサイズをしようとしたら下記のエラーに遭遇しました。
Your server does not support the GD function required to process this type of image.
JPG images are not supported.
当初は Imagemagic で Exif の削除や画像のリサイズ処理をしようとしていましたが、Codeigniter の標準ライブラリが GD を使って(Imagemagicなどそれ以外の画像ライブラリも使える)画像加工する機能を備えているのでそれを利用しました。
Codeigniterの問題?
最初は Codeigniter の image_lib の設定の問題かと思って、設定項目のドキュメントを見ていましたが、どうやら原因は PHP 側の設定にありそうです。
PHPの設定?
まずは GD ライブラリの確認をします。
最初に so ファイルがモジュールのディレクトリに存在するかチェックします。
Amazon Linux で yum のパッケージでインストールした PHP5.5 用のモジュールは下記に存在しました。
1 2 | $ ls /usr/lib64/php/5.5/modules/gd.so gd.so |
次に、上記の gd.so がロードされているかを確認します。
まず、php.ini で読み込んでいるかを確認します。
1 2 3 4 5 | $ ls /etc/php.d/gd.ini gd.ini $ cat /etc/php.d/gd.ini ; Enable gd extension module extension=gd.so |
php クライアントで gd_info() が実行できるか確認します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | $ php -r 'print_r(gd_info());' Array ( [GD Version] => bundled (2.1.0 compatible) [FreeType Support] => 1 [FreeType Linkage] => with freetype [T1Lib Support] => 1 [GIF Read Support] => 1 [GIF Create Support] => 1 [JPEG Support] => 1 [PNG Support] => 1 [WBMP Support] => 1 [XPM Support] => 1 [XBM Support] => 1 [JIS-mapped Japanese Font Support] => ) |
この時点で GD ライブラリはロードされて php で使えそうな感じです。
原因はgdライブラリの警告
そこで、GD ライブラリの php の公式ドキュメントを確認して、以下の項目に行き着きました。
jpeg2wbmp() や imagecreatefromjpeg() が出す警告を無視します。
GD ライブラリはかなり厳密に画像をチェックするようなので、一旦、この警告を無視する設定にします。
今回は、php.ini で指定しました。
1 2 3 4 5 6 7 8 | $ vi /etc/php.ini [gd] ; Tell the jpeg decode to ignore warnings and try to create ; a gd image. The warning will then be displayed as notices ; disabled by default ; http://php.net/gd.jpeg-ignore-warning ;gd.jpeg_ignore_warning = 0 gd.jpeg_ignore_warning = 1 |
普段の動作としては、画像アップロード後に Imagemagic で Exif 情報を削除してそれからリサイズ処理をしていますが、Exif 情報を削除した際に何か情報が不足したのが警告の原因かもしれません。
リサイズ処理と Exif の処理の順序を入れ替えようと思いましたが、そもそもリサイズ時に新しく画像を作れば Exif 情報は消える可能性もありますね。
ImageMagickの方がパフォーマンスもいい
実際に大きなサイズの画像をリサイズする場合、GD だと PHP のメモリを多く消費するため「Allow Memory」がオーバーするエラーに遭遇する確率が高くなります。
しかし先日、サイボウズのブログで以下の投稿がありました。
リサイズは定番機能だけに何かと悩ましい話ですね。