php 使用 imagejpeg() 和 file_put_contents()

问题描述

我使用 file_put_contents() 在目录中存储图像。但是,图像尺寸太大。我想将图像大小从 mb 压缩到 kb 以改进我的 Web 应用程序。但是,我不确定是否可以将 imagejpeg() 函数file_put_contents() 一起使用。只是通知一下,我正在使用 croppie.js 并且图像正在通过 AJAX 传输到一个单独的文件进行处理。

PHP

$image_array_1 = explode(";",$image);
$image_array_2 = explode(",",$image_array_1[1]);
$image = base64_decode($image_array_2[1]);
$imageName = $user['id'][0] . "_" . time() . '.jpg';
$dir = "../images/users/".$user['id'][0]."/"."avatar/";
$imageDirectory = $dir.$imageName;

如果我上传大小为 1 mb 的图像,它的大小将变为 6-7 mb。而不是减少它的大小乘以 6-7 倍。我希望它减少到 50-100 kb 以下。有什么办法可以压缩这里的大小吗?

解决方法

我自己找到了解决方案。我在这里发帖是为了将来寻找它的人。如果您使用 Croppie.js 并且您的文件太大,您需要做的第一件事是将您的图像格式设置为 format: "jpeg"。与 PNG 文件相比,JPEG 本身使用了压缩技术,因此无需执行任何操作即可生成小尺寸文件。现在,如果您想要更好的质量,请设置您的 size: "original"quality: 1。基本上,您的 Croppie 设置应如下所示:

resize.croppie('result',{
  type: "canvas",size: "original",format: "jpeg",quality: 1
})

现在,使用此设置,文件大小应该比 PNG 小,但仍然足够大,可以为 Web 应用程序显示危险信号。因此,解决方案是在上传过程中使用 PHP 压缩图像。现在在这里我不得不面对一个挑战。我在互联网上找到的所有示例都是使用上传图像时通常使用的 $_FILES 方法给出的。但是,正如您在我上面的问题中所看到的,PHP 编码是不同的。因此,我必须找到一种方法来克服这个问题,因为网络上没有给出考虑使用 Croppie.js 上传的相关示例。因此,我继续使用试错法自己找出问题,并能够复制通常与 $_FILES 方法一起使用的图像压缩解决方案。我为它编写了自己的函数。但是,下面的函数只包含JPEG图像类型的解决方案。如果您需要任何其他格式,请随时使用我的函数作为示例并进行相应修改。

function compressImage($image,$imageDirectory,$quality) {
  return imagejpeg(imagecreatefromstring($image),$quality);
}

$image_array_1 = explode(";",$image);
$image_array_2 = explode(",",$image_array_1[1]);
$image = base64_decode($image_array_2[1]);
$imageName = $user['id'][0] . "_" . time() . '.jpg';

if(!file_exists("../images/users/".$user['id'][0]."/"."avatar/")) {
  $dir = mkdir("../images/users/".$user['id'][0]."/"."avatar/",0777,true);
}else{
  $dir = "../images/users/".$user['id'][0]."/"."avatar/";
}

$imageDirectory = $dir.$imageName;
compressImage($image,50);

享受吧!