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

  • 2019年10月9日
  • 2019年10月9日
  • Laravel

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 を使用して データを保存することができます。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG