一般在有前端使用者或者後臺自己上傳圖片的功能時,存在上傳圖片尺寸不一的情況。所以需要在使用者上傳圖片時直接二次處理限制圖片的寬度。
1.加入依賴 本人使用的是laravel5.5 composer方面是選擇的2.4元件版本composer require intervention/image
2.在是否新增註冊這塊一直都有爭論,我這邊採取的還是選擇如果沒有自動註冊,那麼就新增手動註冊。Intervention\Image\ImageServiceProvider::class,
'Image' => Intervention\Image\Facades\Image::class,
3.建立配置檔案 一般情況下都是使用gd模式php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravel5"
4.專案中的實際應用
/**
* 上傳圖片
*/
public function image_upload(Request $req)
{
try {
if ($req->isMethod('POST')) {
$file = $req->file('file');
//圖片寬度引數 可以寫死也可傳值接收 關閉false
$max_width = false;
if ($file->isValid()) {
$realPath = $file->getRealPath();//臨時檔案路徑
$entension = $file->getClientOriginalExtension();//上傳檔案字尾名
$time = date('Ym');
$newName = md5(uniqid(microtime(true), true)) . date('YmdHis') . '.' . $entension;
$path = $file->move(base_path() . '/public/upload/image/' . $time, $newName);
$filepath = '/upload/image/' . $time . '/' . $newName;
// 圖片物理路徑 特別重要 如果路徑則無法識別寫入圖片
$img = public_path().'/'.$filepath;
// 圖片剪裁邏輯 如果限制了圖片寬度且不為gif格式,就進行裁剪
if ($max_width && $entension != 'gif') {
// 此類中封裝的函式,用於裁剪圖片
$this->reduceSize($img, $max_width);
}
return response()->json(['status' => 0, 'msg' => '上傳成功', 'filepath' => $filepath]);
}
}
} catch (Exception $e) {
return $this->doFailure($e);
};
}
//圖片按寬度剪裁
public function reduceSize($img, $max_width)
{
// 先例項化,傳參是檔案的磁碟物理路徑
$image = Image::make($img);
// 進行大小調整的操作
$image->resize($max_width, null, function ($constraint) {
// 設定寬度是 $max_width,高度等比例雙方縮放
$constraint->aspectRatio();
// 防止裁圖時圖片尺寸變大
$constraint->upsize();
});
// 對圖片修改後進行儲存
$image->save();
}
以上就是實現上傳圖片裁剪的方法。
本作品採用《CC 協議》,轉載必須註明作者和本文連結