GDライブラリがロードされているのにJPG images are not supported

GDライブラリがロードされているのにJPG images are not supported

記事一覧GDライブラリがロードされているのにJPG images are not supported

フレームワークとは直接関係ないですが、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 側の設定にありそうです。

画像操作クラス : CodeIgniter ユーザガイド 日本語版

PHPの設定?

まずは GD ライブラリの確認をします。最初に so ファイルがモジュールのディレクトリに存在するかチェックします。Amazon Linux で yum のパッケージでインストールした PHP5.5 用のモジュールは下記に存在しました。

$ ls /usr/lib64/php/5.5/modules/gd.so

gd.so

次に、上記の gd.so がロードされているかを確認します。まず、php.ini で読み込んでいるかを確認します。

$ ls /etc/php.d/gd.ini

gd.ini

$ cat /etc/php.d/gd.ini

; Enable gd extension module
extension=gd.so

php クライアントで gd_info() が実行できるか確認します。

$ 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 の公式ドキュメントを確認して、以下の項目に行き着きました。

gd.jpeg_ignore_warning

jpeg2wbmp() や imagecreatefromjpeg() が出す警告を無視します。

GD ライブラリはかなり厳密に画像をチェックするようなので、一旦、この警告を無視する設定にします。今回は、php.ini で指定しました。

$ 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 情報は消える可能性もありますね。


参考カテゴリ

オススメ記事

最新の投稿やよく見られているのオススメ記事一覧です。

AmazonLinuxでEC2起動時にスワップ領域の割り当てに失敗

EC2 起動時のスワップ領域割り当てですが、これまでは以下の記事を参考に、/etc/rc.local を使って行っていました。 ・ Amazon EC2(Linux)のswap領域ベストプラクティス しかし、最近になって、EC2 イン...

>>記事を確認する

【5分でできる】Laravel5.4から5.5へバージョンアップ

Laravel5.5 がついにリリースされたので、5.4 ベースで作っていたものをバージョンアップしてみました。 composer.json の以下の部分を 5.5.* に変更するだけですが、依存関係のパッケージも問題なくアップデ...

>>記事を確認する

【30分でできる】AWSのEC2にgoofysを入れてS3をマウント

過去に携わったプロジェクトで、S3FS の通信状態が悪い時があるので、アプリ側のプログラムを AWS SDK を使ったものに置き換えていこうという施策がありました。 S3FS の導入には関わっていなかったので、導...

>>記事を確認する

【30分でできる】ぐるなびAPIで飲食店の店舗情報取得

過去に作成した「ぐるなびAPI」のプログラムや、ぐるなびの Web Service が新しくなったこともあり、API からの情報取得プログラムを書き換えてみました。 以前の記事は下記になります。 ・ ぐるなびAPIで...

>>記事を確認する

NginxのFastCGIキャッシュで白い画面がキャッシュされる

以前から、トップページにアクセスすると、レスポンスステータスは 200 で返ってくるのに、画面に何も表示されない現象が稀に見受けられたので調査してみました。 さすがに機会損失にも繋がるということで、...

>>記事を確認する

Laravel5.4の認証ユーザーのパスワードハッシュについて

Laravel で用意されている認証モジュールを利用する際、ユーザーモデル(User.php)経由で登録されるパスワードのハッシュ方法について調べてみました。 Laravel 上ではパスワード文字列を bcrypt() のヘルパー...

>>記事を確認する

Laravel5.4のコントローラコンストラクタでAuth::user()が取得できない

Laravel5.4 で認証を通したアクセスに対して、コントローラのコンストラクタでユーザモデルの値を取得しようと思ったら、なぜか Auth::user() の値が取得できなくて悩みました。 public function __construc...

>>記事を確認する

NginxのHSTS(HTTP Strict-Transport-Security)の設定

「Let's Encrypt」のおかげで、全サイト SSL 化していますが、これまで nginx の設定では、http のアクセスがあった場合に https に 301 リダイレクトさせていました。 この場合、Googlebot に http のアク...

>>記事を確認する

GoogleMapのAPIキーの認証情報にリファラURL設定

昔は API キーを指定することで、JavaScript で GoogleMap が表示できていましたが、何年か前に、そのキーに対して認証情報の追加が推奨されました。 新規で発行する場合は必須になっているかもしれませんが...

>>記事を確認する

【30分でできる】AmazonLinuxでApache2.4+php7.1+Laravel5.5

先日、「 VagrantでCentOS6.9のイメージを使う 」の通り、CentOS6.9 には Apache2.4 と PHP7.1 で Laravel のフレームワークが使える環境を構築しました。 ただ、将来的には AWS かつ Amazon Linux 上で動か...

>>記事を確認する