为什么我的变量的值在这个函数中不断变化?
Why the value of my variable keep changing in this function?
根据我对下面代码的理解,$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;
}
对 Image::make
调用后创建的干预图像对象调用 save
会将数据保存到磁盘。因此,当您调用 save(null, ...)
时,磁盘上上传的文件数据将被覆盖,因为它只会保存到当前路径。然后你用那个路径调用 Image::make
所以它现在再次加载那个文件(有新数据 - 调整大小)而不是原始文件(文件系统中不再存在)。
只需删除 save
调用,如果您想对图像进行编码,您可以直接调用 encode
(因为 save
在以任何方式写入磁盘之前调用 encode
).这样应该可以避免数据被覆盖的问题。
附带说明一下,您实际上可以使用一个单独的干预图像对象完成所有这些调整大小和编码,而不必通过一遍又一遍地调用 Image::make
从磁盘重新加载数据(您可以仅调用 Image::make
).
1 次
根据我对下面代码的理解,$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;
}
对 Image::make
调用后创建的干预图像对象调用 save
会将数据保存到磁盘。因此,当您调用 save(null, ...)
时,磁盘上上传的文件数据将被覆盖,因为它只会保存到当前路径。然后你用那个路径调用 Image::make
所以它现在再次加载那个文件(有新数据 - 调整大小)而不是原始文件(文件系统中不再存在)。
只需删除 save
调用,如果您想对图像进行编码,您可以直接调用 encode
(因为 save
在以任何方式写入磁盘之前调用 encode
).这样应该可以避免数据被覆盖的问题。
附带说明一下,您实际上可以使用一个单独的干预图像对象完成所有这些调整大小和编码,而不必通过一遍又一遍地调用 Image::make
从磁盘重新加载数据(您可以仅调用 Image::make
).