どんな事でもお気軽にお問い合わせください
0120-803-656
24時間受付対応致します

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メソッドが便利です。

簡単な編集だけであれば、上記で事足りるかと思います。
特にサイズ変更は非常に簡単なので、重宝しますね。

 
以上です。


お問い合わせ 採用情報 エンジニアブログ
ISO27001認証
Contact PageTop
株式会社ビヨンド

© beyond Co., Ltd. All rights reserved.

mautic is open source marketing automation