php/Laravel-如何按文件大小压缩上传的图像文件


php / Laravel - How to compress uploaded image file by its file size

我发现图像可以压缩一定的百分比。例如:

$compressed_img = compress($source_img, $destination_img, 90);

在这种情况下,$source_img的大小将减小到原始大小的90%。如果$source_img的原始大小为100kb,则$compressed_img的原始大小将为90kb。

我一直在尝试确定目标文件是否根据原始大小进行压缩,并确定按字节减少多少大小。

例如,如果您需要确保所有上传的文件都在200kb以下,但如果上传的文件大小已经小于该大小,则不能更改大小,该怎么办?

这是一个伪代码。

if($source > 200kb){
    $compressed = compressByByte($source, 200kb);
}//Again, this is a sude code!

由于源文件的大小各不相同,因此使用compress()函数是不切实际的。

如有任何建议,我们将不胜感激。(我在Laravel 5.2中使用php)

我认为你从错误的假设开始,当你压缩图像时,你可以指定一个压缩因子,但这并不意味着输出是原始大小的90%,这在很大程度上取决于图像的内容,有些图像可以比其他图像压缩得更好(单色图像可以比普通照片更小)。

也就是说,你能做的就是

  1. 循环所有图像
  2. 检查图像是否大于您定义的阈值大小(例如200k
  3. 对于每个图像,将图像的压缩版本保存为临时文件
  4. 将原始图像大小与临时大小进行比较,您可以选择保留原始图像大小或使用新的压缩图像大小

请记住,在JPEG中增加压缩会降低图像的质量,如果压缩过高,您会在图像中看到较低的丑陋错误,通常我们不会使用85以下的压缩。