PHPで画像周りの操作をする際はよくGDエクステンションを用いるが、GDの基本リサイズ関数であるimagecopyresized()
は縮小した際のジャギがひどく全くもって使い物にならない。
一応フィルタでスムージングもしくはガウシアンぼかしを適用できるが、やるだけ無駄。
そして多少結果がマシになるimagecopyresampled()
という関数も用意されているがこれもゴミ。~~ホントゴミ~~。
ということでこれからはPHPで画像の操作をする場合はImageMagick
を用いよう。(強制)
Imagickとは
ようはGDより高性能で使いやすいいわゆる神エクステンション。100種類を超す形式の画像読み込みや変換に対応しており、WEBで扱うであろうファイル形式は当然いける。詳細は下記リンク。
http://php.net/manual/ja/book.imagick.php
インストール手順
yumを使おう。
- とりあえずインストールされているPHPのバージョンを確認。
1 |
$ yum list installed | grep php |
- 今回はremiのPHP5.6を導入。
1 |
$ yum search imagick --enablerepo=remi | grep php |
php56-php-pecl-imagick-devel.x86_64
をインストールする。
1 |
$ yum install -y php56-php-pecl-imagick-devel.x86_64 --enablerepo=remi |
※ココから先は環境に依存する(?)場合あり。
ImagickをPHPから読み込む。
- 先ほどのyum操作でインストールされ、生成された
imagick.so
をPHPのインクルードディレクトリにコピーしてやる。 ※自分の場合は下記の感じ。
1 |
$ cp /opt/remi/php56/root/lib64/php/modules/imagick.so /usr/lib64/php/modules/imagick.so |
- 次にphp.dディレクトリにiniファイルを作成。
1 |
$ vim /etc/php.d/imagick.ini |
- 下記のように記述。
1 |
extension=imagick.so |
そしたらhttpdを再起動
phpinfo()
にて下記のように表示されていればインストール成功。
使ってみる。
とりあえず当初からやりたかった画像のきれいなリサイズと切り抜きをやってみた。 今回は元画像の縦長、横長にかかわらず正方形になるようトリミングし、指定のサイズに縮小する処理を行いたかったのでそれをやる。
1 2 3 4 5 |
$thumbnail = new \Imagick(); // Imagickオブジェクトを生成 $thumbnail->readImage($image_path); // 入力画像パスを指定 $thumbnail->cropThumbnailImage(300, 300); // 縦横のピクセル指定 $thumbnail->setImageFormat('jpg'); // 出力フォーマットを指定 $thumbnail->writeImage($output_path); // 画像の出力パスを指定 |
これだけ。イヤほんと簡単。しかもめちゃくちゃキレイ。かなり最適化されてる。 ジャギが全く無いしGDはでスムージングを行なった処理と比較しても格が違う。そもそもの画像処理アルゴリズムが違うんだろうけど、GDがどれだけクソかわかる。
しかもサムネイル作成用の関数が用意されていて長さ指定するだけで中央から綺麗にトリミングしてくれるという至れり尽くせりっぷり。画像のフォーマット別に読み込み関数が分かれていない点も最高に使いやすいし、今後画像処理はImagickで行うことを確信した。