[PHP] 簡単に画像の加工ができるintervention/image | A Day In The Boy's Life

A Day In The Boy's Life

とあるエンジニアのとある1日のつぶやき。

ユーザーがアップロードした画像を加工したいといった場合、Linux系なら「ImageMagickを使ってコマンドラインからCAPTCHAを作ってみる」に書いたようにコマンドラインから画像を加工する方法もありますが、 intervention/imageを使えばPHPのプログラム内で簡単に加工をすることができたりします。

intervention/imageを利用する場合、PHP5.4以上でGDまたはImageMagickがインストールされている必要があります。

 

 

intervention/imageを使ってみる

 

まずは、インストール方法ですがcomposer経由でインストールができます。

composer.jsonを使う場合は、下記のような定義ファイルを用意しcomposer updateを実行します。

 

{
    "require": {
        "intervention/image": "2.3.*"
    }
}

 

または、直接composerコマンドから指定してインストールします。

 

$ composer require intervention/image

 

Laravelから使いたい場合は、app.phpにサービスプロバイダに追加すれば使えます。

 

'providers' => array(
    -snip-
    'Intervention\Image\ImageServiceProvider',
),

 

簡単なサンプルプログラムとしては下記のようなものになります。

 

<?php
require 'vendor/autoload.php';
use Intervention\Image\ImageManagerStatic as Image;

$image = Image::make('./foo.jpg')->resize(150, 100)->save('./hoge.jpg');

 

autoload.phpを呼び出し、名前空間の定義をしてstaticでメソッドを呼び出しています。

staticではなくクラスオブジェクトを生成して使うことももちろん可能です(公式のサンプル参照)。

上記の場合、画像の加工としてはfoo.jpgに対して150x100pxにリサイズし、hoge.jpgとして保存しています。

その外に出来ることは、公式マニュアルのAPI一覧を見ればわかるかとおもいますが、代表的なものを紹介します。

 

□ 画像を曇らせる(ぼかす)

 

$image = Image::make('./foo.jpg')->blur(50)->save('./hoge.jpg');

 

blur()の引数で曇らせる度合いを指定します。

 

 

□ 明度を変える

 

$image = Image::make('./foo.jpg')->brightness(50)->save('./hoge.jpg');

 

brightness()の引数で明度を調整できます。

 

 

□ モノクロにする

 

画像を白黒にするあれです。

 

$image = Image::make('./foo.jpg')->greyscale()->save('./hoge.jpg');

 

□ 透明化する

 

Image::make('./foo.jpg')->opacity(50)->save('./hoge.jpg');

 

opacity()の引数で透明度を調整できます。

 

□ 画像の一部を切り抜く

 

$image = Image::make('./foo.jpg')->crop(50, 50, 45, 25)->save('./hoge.jpg');

 

crop()の第1、第2引数は切り抜いた画像のサイズ、第3、第4引数は切り抜き位置(X座標、Y座標)を指定します。

 

□ 画像の余白を削除する

 

キャンパス内に余白がある場合にそれを削って画像の大きさにフィットさせることができます。

 

Image::make('./abc.png')->trim()->save('./hoge.jpg');

 

□ 画像を反転する

 

Image::make('./foo.jpg')->flip('v')->save('./hoge.jpg');

 

flipの第1引数にvを指定すると上下反転させます。デフォルトは左右反転です。

 

 

□ 画像のフォーマットを変更する

 

専用のencode()というメソッドがあるようですが、save()で指定したファイル名でフォーマットを決めて保存することも出来ます。

 

Image::make('./foo.jpg')->save('foo.gif');

 

encode()メソッドの特徴としてdata-urlオプションを指定するとRFC 2397形式のdata://のURIスキームを返してくれたりします。

 

$image = Image::make('./foo.jpg')->encode('data-url');
echo "<img src="$image" />";

 

□ 画像の情報を取得する

 

下記は、画像のサイズを取得します。

 

$size = Image::make('./foo.jpg')->filesize();

 

下記は、画像の高さや横幅を取得します。

 

$height = Image::make('./foo.jpg')->height();
$width = Image::make('./foo.jpg')->width();

 

下記は、画像のMIMEタイプを取得します。

 

$mime = Image::make('./foo.jpg')->mime();

 

下記は、画像のexifを取得します。

 

$exif = Image::make('./abc.jpg')->exif();

 

出力例。

 

array(48) {
["FileName"]=> string(7) "abc.jpg"
["FileDateTime"]=> int(1478581452)
["FileSize"]=> int(188983)
["FileType"]=> int(2)
["MimeType"]=> string(10) "image/jpeg"
["SectionsFound"]=> string(46) "ANY_TAG, IFD0, THUMBNAIL, EXIF, INTEROP, WINXP"
["COMPUTED"]=> array(10) {
    ["html"]=> string(24) "width="640" height="480""
    ["Height"]=> int(480)
    ["Width"]=> int(640)
    ["IsColor"]=> int(1)
    ["ByteOrderMotorola"]=> int(1)
    ["ApertureFNumber"]=> string(5) "f/2.8"
    ["UserComment"]=> string(1) " "
    ["UserCommentEncoding"]=> string(9) "UNDEFINED"  
    ["Thumbnail.FileType"]=> int(2)
    ["Thumbnail.MimeType"]=> string(10) "image/jpeg"
}
-snip-

 

□ 画像を一から作る

 

かなり手間にはなりますが、画像を一から作ることも出来ます。

 

// 300x300pxの灰色のキャンパスを作成
$image = Image::canvas(300, 300, '#999');
// 左上から右下にかけて線を引く
$image->line(0, 0, 300, 300, function ($draw) {
    $draw->color('#0000ff');
});
// 長方形を描く
$image->rectangle(20, 20, 250, 250, function ($draw) {
    $draw->background('#00ff00');
});
// 中心部に円を書く
$image->circle(50, 150, 150, function ($draw) {
    $draw->background('#ff0000');
});
$image->save('./hoge.jpg');

 

それぞれコールバック関数を指定できるのでその中で線や塗りつぶしの色を指定することができたりします。

 

 

まぁ、正直よく使いそうなのは画像のフォーマットの変換やリサイズぐらいかなとは思うのですが、導入も簡単なので画像を加工したい場合に使ってみると良いかと思います。