1つ覚えて3つ忘れる、FuelPHPのImageクラスの使い方
こんにちは。
開発チームのワイルド担当、まんだいです。
PHPで画像を扱う場合、大抵GDを使うかImageMagickを使うかで、まず二択を迫られます。
変換後の精度でImageMagickを使うか、インストールが簡単なGDを使うか、ここは好みや状況によりけりだと思います。
ただ、一つ面倒なのは、使い方が全然違うので、画像処理のやり方を2パターン覚える必要があるという事。
今回は、この2つのライブラリが持つベーシックな機能をラッピングして、共通のメソッドで呼び出せる、FuelPHPのImageクラスをご紹介します。
さらにFuelPHPは、IMagickをインストールしていない場合でも、ImageMagickをインストールしていれば、exec関数を通じて、convertコマンドを利用して変換する方法も提供してくれています。
FuelPHPのバージョンは、1.8を利用しています。
ライブラリをインストールする
インストールは、パッケージマネージャ経由でできるので、基本的には簡単です。
GD、ImageMagickそれぞれの導入手順をまとめてみました。
GDのインストール
CentOSの場合、GDのインストールは、yumコマンドで完了します。
今回は、remiのPHP5.6がインストールされた環境で、GDの追加を行いました。
sudo yum install --enablerepo=remi-php56 php-gd
後は、ウェブサーバーを再起動して、完了です。
phpinfo()の結果を見て、GDに関する記述があれば成功です。
ImageMagickのインストール
次にImageMagickのインストールを行う場合の手順です。
ちなみに、PHPで画像編集をやりたい場合、GD、ImageMagickのいずれかがインストールされていればOKです。
両方は必要ありません。
まずは、ImageMagickのインストールをyumコマンドで済ませます。
sudo yum install ImageMagick
実行するLinuxによっては、既にインストールされている場合もあります。
その時は、次へ進みましょう。
次は、PHPからImageMagickを扱うための拡張ライブラリである、IMagickをインストールします。
IMagickのインストール
次にPECLを使って、PHP側のライブラリ、IMagickをインストールします。
何も考えずに、以下のようにコマンドを叩くと・・・
pecl install imagick Cannot install, php_dir for channel "pecl.php.net" is not writeable by the current user
という感じで怒られます。
以下のように、sudoを付けて実行しましょう。
sudo pecl install imagick downloading imagick-3.4.3RC1.tgz ... Starting to download imagick-3.4.3RC1.tgz (245,140 bytes) .............................done: 245,140 bytes 19 source files, building running: phpize Configuring for: PHP Api Version: 20131106 Zend Module Api No: 20131226 Zend Extension Api No: 220131226 Please provide the prefix of Imagemagick installation [autodetect] : building in /var/tmp/pear-build-rootELyyWP/imagick-3.4.3RC1 running: /var/tmp/imagick/configure --with-php-config=/usr/bin/php-config --with-imagick checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E checking for a sed that does not truncate output... /bin/sed checking for cc... cc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether cc accepts -g... yes checking for cc option to accept ISO C89... none needed checking how to run the C preprocessor... cc -E checking for icc... no checking for suncc... no checking whether cc understands -c and -o together... yes checking for system library directory... lib checking if compiler supports -R... no checking if compiler supports -Wl,-rpath,... yes checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for PHP prefix... /usr checking for PHP includes... -I/usr/include/php -I/usr/include/php/main -I/usr/include/php/TSRM -I/usr/include/php/Zend -I/usr/include/php/ext -I/usr/include/php/ext/date/lib checking for PHP extension directory... /usr/lib64/php/modules checking for PHP installed headers prefix... /usr/include/php checking if debug is enabled... no checking if zts is enabled... no checking for re2c... no configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers. checking for gawk... gawk checking whether to enable the imagick extension... yes, shared checking for pkg-config... /usr/bin/pkg-config checking ImageMagick MagickWand API configuration program... checking Testing /usr/local/bin/MagickWand-config... Doesn't exist checking Testing /usr/bin/MagickWand-config... Doesn't exist checking Testing /usr/sbin/bin/MagickWand-config... Doesn't exist checking Testing /opt/bin/MagickWand-config... Doesn't exist checking Testing /opt/local/bin/MagickWand-config... Doesn't exist configure: error: not found. Please provide a path to MagickWand-config or Wand-config program. ERROR: `/var/tmp/imagick/configure --with-php-config=/usr/bin/php-config --with-imagick' failed
エラーで止まってしまいました。
こういう時、[パッケージ名]-develという開発用のパッケージをインストールするとうまくいく事が多いというのは、私の経験則的なところで、あるかどうかも分からない、でもとりあえず次のようなコマンドを叩いてみます。
sudo yum install ImageMagick-devel
無事あったようで、インストールします。
依存するパッケージが多く、少し時間がかかるかもしれません。
無事インストールできたら、再度PECLからIMagickのインストールを試します。
sudo pecl install imagick downloading imagick-3.4.3RC1.tgz ... Starting to download imagick-3.4.3RC1.tgz (245,140 bytes) .............................done: 245,140 bytes 19 source files, building -- 中略 -- Build process completed successfully Installing '/usr/lib64/php/modules/imagick.so' Installing '/usr/include/php/ext/imagick/php_imagick_shared.h' install ok: channel://pecl.php.net/imagick-3.4.3RC1 configuration option "php_ini" is not set to php.ini location You should add "extension=imagick.so" to php.ini
無事コンパイルが終わり、インストールできたようです。
最後の方に、php.iniに "extension=imagick.so" を追加してねというメッセージがあるので、追加しましょう。
スマートにやるなら、/etc/php.d/ 以下に適当な名前のiniファイルを作成し、"extension=imagick.so" を仕込んでおけばOKですね。
後はGD同様、ウェブサーバーを再起動すればOKです。
FuelPHPから各種画像ライブラリを扱う準備
まず、Imageクラスの設定を扱う、configファイルを用意します。
デフォルトの設定は、fuel/core/config/image.php になりますので、これを fuel/app/config 以下にコピーします。
FuelPHPのルートディレクトリからだと、以下のコマンドでコピーできます。
cp -a fuel/core/config/image.php fuel/app/config/image.php
コピー後、fuel/app/config/image.php を編集していきます。
設定箇所は、26行目の使用するライブラリの設定。
'driver' => 'gd',
デフォルトでは、GDが選択されていますので、ImageMagickを使う場合は、'imagemagick'、'imagick'のいずれかに変更します。
続いて、画質の設定です。
'quality' => 94,
デフォルトだと、最高画質の100%になっていて、JPEGだと変換後のファイルサイズが数倍になってしまいます。
GDのデフォルト値は75なので、75~95あたりで調整した方がよいでしょう。
後はお好みで、というところでしょうか。
初期状態だと、一度saveメソッドやoutputメソッドを実行すると、画像をリロードします。
何かしらの理由で、同じ画像をもう一回使いたい(outputした画像をsaveしたいなど)の場合は
'persistence' => true,
としておくと、リロードしなくなりGoodなようです。
いざ編集してみる
画像のロードはFuel\Core\Imageクラスから行います。
このクラスがconfigの内容に沿ったGD、IMagick、ImageMagick用のドライバーを選定してくれます。
$image = Fuel\Core\Image::forge(null, '/path/to/image');
これで画像のロードは完了です。
GDを使う場合では、imagecreatefrom*系の関数を自分で選んで使う必要がありましたが、クラス内で見分けて定義してくれます。
とはいえ、拡張子ベースでしか見分けていないので、拡張子がないファイルをロードする時、エラーが出ます。
この場合は、forgeせず、loadメソッドを利用します。
$image = Fuel\Core\Image::load('/path/to/image', false, 'jpg');
第3引数で、拡張子を指定する事ができます。
拡張子がないファイルを編集する場合は、バイナリで確認するしかないので、ちょっと工夫する必要があります。
第2引数は、GDの場合のみ有効な引数で、使い道がよく分かりませんでした。
この場合は、configの追加や上書きができないので、事前の設定ファイルをしっかり作っておく必要があります。
各種編集については、Image - クラス - FuelPHP ドキュメントが便利です。
ここにあるメソッドは各ドライバー共通なので、理解するのはここだけでOKです。
画像のトリミングなら、cropメソッドが便利です。
中心からトリミングする場合は、crop_resizeメソッドがお手軽です。
画像のサイズ変更なら、resizeメソッドが便利です。
画像を回転させる場合は、rotateメソッドが便利です。
GDを使う場合、30度や45度などで背景が見える場合は、透過色の設定ができないようです。
画像を反転(鏡に写したように上下、左右の向きを変える)する場合は、flipクラスが便利です。
画像にウォーターマークを付ける場合は、watermarkメソッドが便利です。
画像に枠を付ける場合は、borderメソッドが便利です。
ロードした画像に画像をマスクしたい場合は、maskメソッドが便利です。
角丸画像に変換する場合は、roundedメソッドが便利です。
ただ、ImageMagickと透過画像の組み合わせでメソッドを使う場合では、四隅の透過部分が透過されない不具合があるようです。
GDは、PHP上で計算して色情報を算出しています。
画像サイズを知りたい場合は、sizesメソッドが便利です。
この場合のサイズは、画像の縦横のピクセル数で、ファイルサイズではありません。
ファイルサイズの取得は、filesizeという標準関数を利用します。
画像をグレースケールに変換する場合は、grayscaleメソッドが便利です。
Imagick、ImageMagickは、ImageMagickから提供されている専用関数を、GDはループで全ピクセルを抽出して、PHP上で各ピクセルの色情報を計算しています。
HTTPヘッダを送信して画像をブラウザに表示したい場合は、outputメソッドが便利です。
簡単な編集だけであれば、上記で事足りるかと思います。
特にサイズ変更は非常に簡単なので、重宝しますね。
以上です。