PHP压缩图像

时间:2018-02-14 17:52:10

标签: php

我正在尝试使用imagefromjpeg压缩上传的图像,但我收到此错误:

Fatal error: Allowed memory size of 67108864 bytes exhausted (tried to allocate 24000 bytes) 

图像只有13215317字节大 - 为什么我一直收到这个错误?我不能自己为服务器增加内存 - 所以有没有一种方法可以在不加载整个图像的情况下进行压缩?

$image = imagecreatefromjpeg('../../uploads/DSC_0230.jpg');
imagejpeg($image, '../../uploads/DSC_0230.jpg.new', 0.8);

imagedestroy($image);

2 个答案:

答案 0 :(得分:1)

以这种方式将图像加载到PHP中将首先将JPEG解压缩为内存中的原始像素数据,然后生成新版本。因此,它将占用内存相当于图像分辨率的两个原始位图,以及PHP和脚本的其他开销。

由于您所做的只是使用不同选项重新压缩图像,因此使用专为该作业构建的工具(例如jpegtranjpegstrip)或一般图像,您可能会获得更好的性能像ImageMagick这样的操纵工具。

然后,您可以使用shell_exec从您的PHP脚本调用那些 - 非常小心,您已经验证了文件名,以便有人不能使用它来运行任意命令。

答案 1 :(得分:1)

问题:

  • 您的托管服务提供商为您提供仅限64Mb内存限制的服务。
  • 您的图片上传内存使用量超过64Mb 未压缩的原始像素数据

解决方案:

1)增加PHP.ini文件中的内存限制,通常使用:

memory_limit = 128M 

2)仅增加页面内存限制,仅为该页面执行编辑php.ini

ini_set('memory_limit','128M');

3)限制原始文件上传的大小。

有几种方法可以执行此操作,因此请{GS {3}}以及通过Google搜索找到的read the PHP manual重新发布。

4)您也可以尝试some useful posts

从您的声明中,您无法使用ini_set编辑PHP.ini,看起来您应该使用选项4和3.

此外,您当前的代码不正确。

imagejpeg($image, '../../uploads/DSC_0230.jpg.new', 0.8);

压缩值应为0到100之间的整数,以便将保存的JPEG正确设置为适当的压缩级别:

imagejpeg($image, '../../uploads/DSC_0230.jpg.new', 80);

这会将图片保存为80压缩值(您看起来像0.8尝试的值)。