php 使用 imagejpeg() 和 file_put_contents()

Posted

技术标签:

【中文标题】php 使用 imagejpeg() 和 file_put_contents()【英文标题】:php using imagejpeg() with file_put_contents() 【发布时间】:2021-08-14 23:33:10 【问题描述】:

我正在使用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。有什么办法可以压缩这里的大小吗?

【问题讨论】:

看看这里如何使用 PHP 缩小图像:***.com/questions/14649645/resize-image-in-php "如果我上传 1 mb 大小的图像,它会变成 6-7 mb。"这是没有意义的。文件不会“变大”,除非你让它们变大。 @miken32 我知道,但请告诉我在上面的代码中你能看到我“强迫”它变大的地方吗?我不在乎这是否有意义。这就是这里发生的事情。我已经测试了所有回合。检查上传图像的大小之前和之后,并说出我发现的结果。无论如何,你对我的问题有解决方案吗? 图片尺寸增加可能是由于Croppie.js。见这里github.com/Foliotek/Croppie/issues/287 @cOle2 对.. 我知道.. 所以我想在服务器端处理期间压缩它并减小它的大小。我找到的压缩解决方案是根据使用$_FILES方法的直接PHP上传。但是,这里我是使用 AJAX 上传的,处理方法与平时不同。任何与问题中我的代码相关的解决方案? 【参考方案1】:

我自己找到了解决方案。我在这里为将来寻找它的人发帖。如果您使用 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), $imageDirectory, $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, $imageDirectory, 50);

享受吧!

【讨论】:

以上是关于php 使用 imagejpeg() 和 file_put_contents()的主要内容,如果未能解决你的问题,请参考以下文章

php jquery jcrop 和 imagejpeg

PHP 输出图像 imagegif imagejpeg 与 imagepng 函数

PHP GD imagejpeg:输出文件大小比原始文件大

Docker PHP-FPM 调用未定义函数 Intervention\Image\Gd\imagejpeg()

imagepng或imagejpeg浏览器无显示问题

GD,加载 libJPEG,imagejpeg 返回 false