課題
Laravelプロジェクトで画像処理に Intervention Image を導入しようとしても、
Class Intervention\Image\ImageManager not found
のようなエラーになる可能性がある。 LaravelのServiceProviderによるバインドが適切に行われていない、あるいはIntervention Imageのバージョン違いによるものである。
特に Intervention Image v3系 では、従来の Image::make() のような使い方ができなくなっており、明示的にドライバを指定する新しい書き方が必要になる。
ここでは、自前で軽量に画像のリサイズと WebP 変換を行うユーティリティクラスを作成する方法を紹介する。
対応方法
use Intervention\Image\Facades\Image;
の代わりに以下の書き方でうまくいった。
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
use Intervention\Image\Encoders\WebpEncoder;
このように、ImageManager を new でインスタンス化し、明示的に Gd ドライバを指定して使います。これにより、LaravelのServiceProviderに依存せずで使用可能となる。
これでリサイズとWebP変換を実装する。
具体例
<?php
namespace App\Utils;
use Illuminate\Support\Facades\Storage;
use Intervention\Image\ImageManager;
use Intervention\Image\Drivers\Gd\Driver;
use Intervention\Image\Encoders\WebpEncoder;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Carbon;
class ImageUtil
{
public static function imageUpload($file, string $dir, ?string $name)
{
// 省略
}
private static function convertToWebP($file)
{
// GDドライバを使って ImageManager を初期化
$manager = new ImageManager(new Driver());
// アップロードされた画像ファイルを読み込む
$image = $manager->read($file);
// WebP形式へのエンコーダを作成
$webpEncoder = new WebpEncoder();
// WebP形式にエンコード
$webpImage = $image->encode($webpEncoder);
return $webpImage;
}
private static function resizeImage($file)
{
// GDドライバを使って ImageManager を初期化
$manager = new ImageManager(new Driver());
// アップロードされた画像ファイルを読み込む
$image = $manager->read($file);
// 画像を最大1920x1080にリサイズ(アスペクト比は保持される)
$image->scaleDown(width: 1920, height: 1080);
return $image;
}
}
[参考]