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