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 传输到单独的文件进行处理。
$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 输出图像 imagegif imagejpeg 与 imagepng 函数