【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜】インフラ / サーバーサイドエンジニア募集中!

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始!

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【低コスト】Wasabi オブジェクトストレージ 構築・運用サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【中国現地企業に対応】中国クラウド / サーバー構築・運用保守

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

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

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

以上です。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
1,843
X facebook はてなブックマーク pocket
【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024.6.30 CentOS サポート終了】CentOS サーバー移行ソリューション

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始いたします!

【2024年2月~】25年卒 エンジニア新卒採用の募集を開始いたします!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

【大阪 / 横浜】インフラエンジニア・サーバーサイドエンジニア 積極採用中!

この記事をかいた人

About the author

萬代陽一

ソーシャルゲームのウェブ API などの開発がメイン業務ですが、ありがたいことにマーケティングなどいろんな仕事をさせてもらえています。
なおビヨンド内での私の肖像権は CC0 扱いになっています。