在我對下面代碼的理解中,$image 的值應該始終相同(傳遞給函式的原始值),但令我驚訝的是它一直在變化(第一個 dd() 的值與第二個不同),每次呼叫 resize() 方法時都會導致影像質量更差。不應該將調整后的值保存在不同的變數中(例如:$imageSmallJpg)在函式執行期間保持 $image 不可變?
private function saveTransformedImages($image, $imagePath, $storageDrive)
{
dd($image);
$imageName = pathinfo($image->getClientOriginalName(), PATHINFO_FILENAME);
$imageSmallJpg = $this->resize($image, 500);
$imgSaveName = $imageName . '-sm.jpg';
Storage::disk($storageDrive)->put($imagePath . '/' . $imgSaveName, $imageSmallJpg);
$imageSmallWebp = $this->convertToWebp($imageSmallJpg);
$imgSaveName = $imageName . 'sm-.webp';
Storage::disk($storageDrive)->put($imagePath . '/' . $imgSaveName, $imageSmallWebp);
dd($image);
$imageMediumJpg = $this->resize($image, 960);
$imgSaveName = $imageName . '-md.jpg';
Storage::disk($storageDrive)->put($imagePath . '/' . $imgSaveName, $imageMediumJpg);
$imageMediumWeb = $this->convertToWebp($imageSmallJpg);
$imgSaveName = $imageName . '-md.webp';
Storage::disk($storageDrive)->put($imagePath . '/' . $imgSaveName, $imageMediumWeb);
$imageLargeJpg = $this->resize($image, 1300);
$imgSaveName = $imageName . '-lg.jpg';
Storage::disk($storageDrive)->put($imagePath . '/' . $imgSaveName, $imageLargeJpg);
$imageLargeWebp = $this->convertToWebp($imageSmallJpg);
$imgSaveName = $imageName . 'lg-.webp';
Storage::disk($storageDrive)->put($imagePath . '/' . $imgSaveName, $imageLargeWebp);
}
相關方法:
public function resize($image, $maxWidth)
{
$img = Image::make($image);
$img->resize($maxWidth, null, function ($constraint) {
$constraint->aspectRatio();
});
$img = $img->save(null, 70, 'jpg');
return $img;
}
public function convertToWebp($image)
{
$webp = $image->save(null, 70, 'webp');
return $webp;
}
uj5u.com熱心網友回復:
呼叫呼叫save后創建的 Intervention Image 物件Image::make會將資料保存到磁盤。因此,當您呼叫時,磁盤上上傳的檔案資料將被覆寫,save(null, ...)因為它只會保存到當前路徑。然后您Image::make使用該路徑進行呼叫,因此它現在再次加載該檔案(具有新資料 - 調整大小)而不是原始檔案(檔案系統上不再存在)。
只需洗掉save呼叫,如果您想對影像進行編碼,您可以encode直接呼叫(因為在以任何方式寫入磁盤之前save呼叫)。encode這應該避免資料被覆寫的問題。
附帶說明一下,您實際上可以使用單個干預影像物件完成所有這些調整大小和編碼,而無需通過Image::make一遍又一遍地呼叫從磁盤重新加載資料(您可以只呼叫 1 次Image::make)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/481776.html
