目的
AWSの経費削減の為に画像品質を保証する前提でS3にアップする画像の圧縮をして欲しいと言うデイレクターからの要望を実現
必要条件
[1] ライブラリであるGDのインストール
$ yum install php-gd
# GD ライブラリの情報を確認
php -r 'print_r(gd_info());'
[2] Intervention Imageのインストール
$ composer require intervention/image
あるいはcomposer.jsonファイルに下記を追加
"intervention/image": "^2.5",
Laravelの設定
app\config\app.phpファイルに下記を追加
[1] Intervention Imageのサービスプロバイダの追加
'providers' => [
Intervention\Image\ImageServiceProvider::class,
],
[2] Intervention Imageのファサードの追加
'aliases' => [
'Image' => Intervention\Image\Facades\Image::class,
],
Controller作成
namespace App\Http\Controllers\User;
use Intervention\Image\Facades\Image as Image;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Storage;
class UploaderController extends Controller
{
public function putImageTmp()
{
$file = request()->file('file');
$image = Image::make($file);
$image->resize(70, 50);
$path = request()->file('file')
->store(config('const.file_tmp_dir'));
return response()->success([
'url' => Storage::url($path),
'path' => $path,
]);
}
高さのみ指定し横は同じ比率でリサイズしたい場合
$image->resize(null, 50, function ($constraint) {
$constraint->aspectRatio();
});
ちょっとだけハマったところ
[1] ライブラリであるGDのインストールされていないと下記のエラーが発生
local.ERROR: Call to undefined function Intervention\Image\Gd\imagecreatefromjpeg() {"userId":11,"exception":"[object] (Error(code: 0): Call to undefined function Intervention\\Image\\Gd\\imagecreatefromjpeg() at /var/www/html/projdir/vendor/intervention/image/src/Intervention/Image/Gd/Decoder.php:38)
[2] GD ライブラリの情報を確認
$ php -r 'print_r(gd_info());'
Array
(
[GD Version] => bundled (2.1.0 compatible)
[FreeType Support] => 1
[FreeType Linkage] => with freetype
[GIF Read Support] => 1
[GIF Create Support] => 1
[JPEG Support] => ←「JPEG Support」が有効になっていない
[PNG Support] => 1
[WBMP Support] => 1
[XPM Support] => 1
[XBM Support] => 1
[WebP Support] =>
[BMP Support] => 1
[JIS-mapped Japanese Font Support] =>
)
[3]ライブラリであるGDのインストール
$ yum install php-gd
GD ライブラリの情報を確認
$ php -r 'print_r(gd_info());'
下記のようにJPEG Support」が「1」有効になればOK
[GIF Create Support] => 1
画像リサイズ結果
画像リサイズ以外色々遊べます
モザイク
$img->pixelate(50);
グレースケール
$img->greyscale();