ホーム
Sponserd by↑転職したい人向け、ベンチャー企業の採用動画があります

【Laravel】Intervention Imageで画像を加工して保存 画像圧縮に便利

LaravelのIntervention Imageというライブラリで画像を加工して保存するということをしたので、記事にしたいと思います。

もともと保存された画像も使えますし、アップロードされた画像使って加工もできますし、すげえ便利でした。

環境

php v7.4.1
Laravel Framework 6.16.0
composer.json

"intervention/image": "^2.5"

インストール

http://image.intervention.io/getting_started/installation#laravel

ぶっちゃけドキュメントの要約です。

コマンドで

$ composer require intervention/image

をしてインストールします。

config/app.php

~~~~~~
'providers' =>[
~~~~~~
Intervention\Image\ImageServiceProvider::class
~~~~~~
]

~~~~~~
'aliases' => [
~~~~~~
'Image' => Intervention\Image\Facades\Image::class
~~~~~~
]

上記を追記。

最後にコマンド

$ php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravelRecent"

このコマンドでconfig/image.phpができ、driverをgdに指定するという処理が書いてあります。

gdっていうのはLaravelに入っている画像処理のためのライブラリです。

使ってみる

これ以降は全てコントローラの記述です。

use Image;

まず宣言します。

その後は、

例えばですが、

$path = storage_path('app/public/pop/pop1.png');
$img = Image::make($path);

これで画像データを定義します。

ファイルの指定(階層の指定の仕方はほんとややこしいです)

例えば、今回で言えば、storage_path()を使っているので

storageを基準にスタートします。

ファイルの指定はドキュメントのここに書いてあります。

https://readouble.com/laravel/6.x/ja/filesystem.html

話逸れましたが、この$imageをレスポンスで返せば画像が表示できます。

また、同じようにS3からも画像データを持ってこれます。というか、パブリックな画像に関しては全てパスを指定すれば持ってこれます。

例えば実際に自分が作ったコードでは、

$product_image_url = File::find($product->file_id)->file_url;
$product_image = Image::make(config('aws.url').$product_image_url)->resize(430, 430);

filesテーブルでS3ストレージからデータを引っ張ってくる設計にしているので、::make()の中に画像のURLが入ります。

しれっと出てきているresizeは、width✖︎heightです。つまり、圧縮ができます。

画像に画像をがっちゃんこする

こんな感じでinsertするだけ。

$img->insert($product_image, 'top-left', 0, 30);

左上から横0px、縦30pxの場所に挿入することができます。

テキストを挿入したり、透過させたり、ほんとなんでもできます。

できることについては、この記事がマジで神なので興味がある方は読んでみてください。

https://blog.capilano-fw.com/?p=1574

最後に保存のサンプルです。

$file_path = storage_path('app/temp/'.Auth::id());
$img->encode('jpg')->save($file_path);

上記は一時フォルダに保存していますが、Laravelの機能で保存できます。

S3に保存する場合、

$disk = Storage::disk('s3');
$thumbnail_upload_path = 'upload/movie_thumbnail/'.Auth::id();
$disk->put($thumbnail_upload_path, file_get_contents($file_path), 'public');

このような感じでfilegetcontents()を使って一時フォルダからS3に保存しています。

一時ファイルの削除

return response()->download($file, 'ファイル名.jpg', $headers)->deleteFileAfterSend(true);

これはダウンロード機能の場合だけど、deleteFileAfterSend(true)メソッドを使うと一時ファイルを消してくれます。便利。

Storage::disk('local')->delete($path);

ファイルが保存されているディレクトリを参照してファイルを消します。

ちなみにこのdisk(‘local’)はappから参照が始まるので、$pathはpublic/~~となってます。ややこしいけど、フレームワークは形が決まっているので覚えるしかなさそう。

以上です。

便利なライブラリなので記述自体は少なく、色んなことができます。

が、ファイルの指定をしっかりしないといけないので、そのファイルの指定がややこしいのでハマるときはハマるのではないかなと思います。