LaravelでIntervention/image で圧縮した画像をファイルに保存せずにバイナリで取得する方法

takahashi 著者:takahashi

LaravelでIntervention/image で圧縮した画像をファイルに保存せずにバイナリで取得する方法

Laravelで画像ファイルの変換処理を行いたい場合、Intervention/image というComposerパッケージを使用すると非常に楽です。

詳しいセットアップ方法は、下記のサイトを参考にしてみてください。

さて、このIntervention/imageですが、使い方を解説している多くのサイトで、下記のように変換した画像を Intervention/image のsave()メソッドを使った保存方法を紹介しているところが多いです。

...
$image = Image::make(画像ファイルのパス); //画像をパスから取得
$image->resize(500, 500);

...

しかし今回僕が行いたかった処理は”元ファイルを変換して保存する”のではなく、”元画像を圧縮してサムネイル画像を作成してRestAPI経由でbase64でクライアントに投げる”ということをしたかったため、ファイルの保存は不要でした。

そこで色々調べたところ、 Intervention/image にファイルへ保存ではなく、バイナリストリームをそのまま吐き出すメソッドが存在していることを知りました。

Cannot save image intervention image. NotWritableException in Image.php line 138 -StackOverflow

$img = Image::make(画像ファイルのパス)->resize(500,500)->stream('jpg', 50)

このようにすると、$img変数に変換後の写真バイナリデータが吐き出されるため、あとはこのバイナリデータを

$img_base64 = base64_encode ( $img  );

のようにすると、base64に変換されたデータが入手できます。

これで、目的の動作をさせることがきました。

なお、Laravelでは

$image->save(画像の保存先パス);

すると権限の問題でエラーになってしまいます。

 NotWritableException in Hoge.php line 138: Can't write image data to path path/to/image.jpg 

Laravelで変換後のファイルを保存したい場合は、上の方法でバイナリデータを取り出した後、

Storage::put('保存先ファイルパス', $img);

のようにすれば、 Laravel上でも Intervention/image を使用して データを保存することができます。

  • この記事いいね! (0)

著者について

takahashi

takahashi administrator

Webエンジニア。 趣味で自宅サーバーを稼働中。 ファンタジーが好き。