PHP - imagecreatefromjpeg为< 1M图像使用100M内存

时间:2013-07-20 07:41:49

标签: php image

图像小于1MB,但大小约为5500x3600。我试图将图像调整为低于500x500的尺寸。我的代码很简单。

    $image = imagecreatefromjpeg("upload/1.jpg");
    $width = imagesx($image);
    $height = imagesy($image);
    $pWidth = 500;
    $pHeight =  334;
    $image_p = imagecreatetruecolor($pWidth, $pHeight);
    setTransparency($image,$image_p,$ext);
    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $pWidth, $pHeight, $width, $height);

我发现要处理此图像,imagecreatefromjpeg使用memory_get_usage使用100M。

有没有更好的方法来做imagecreatefromjpeg?是否存在使用较少内存的变通方法或不同功能?

我确实要求我的服务器管理员增加内存,但我怀疑他们会将其增加到100M或更多。我正在考虑限制用户可以上传的图像的尺寸,但在用尽所有选项之前不会,因为用户很可能会上传他们拍摄的图像。

顺便说一句,以下是我使用的使用100M内存的图像

enter image description here

2 个答案:

答案 0 :(得分:2)

@ dev-null-dweller所说的是正确答案:

  

使用5500x3600,内存中至少需要5500 * 3600 * 4个字节= ~80MB。对于大图片,Imagick扩展可能比GD

具有更好的性能

没有办法“改进”,因为这是处理图像所需的内存量。 JPEG是一种压缩格式,因此其文件大小无关紧要,它是实际的维数。在GD中处理这种图像的唯一方法是增加内存限制。

如果你有权使用像ImageMagick这样的库/命令行客户端,你可以做得更好 - 当你run ImageMagick from the command line时,它的内存使用量不会计入内存限制。无论您是否可以执行此操作,都需要从Web主机或服务器管理员处找到。

我想到的另一个想法是使用您发送图像的图像大小调整API。这将使负载完全脱离您的服务器。这个问题有一些指示:https://stackoverflow.com/questions/5277571/is-there-a-cdn-which-provides-on-demand-image-resizing-cropping-sharpening-et

答案 1 :(得分:1)

至少在命令行上的ImageMagick能够使用名为“Shrink on Load”libjpeg功能,以避免在您只计划时不必要地加载整个图像缩小它。

如果我将您的图片从当前的3412x2275调整到您实际处理的尺寸,请像这样5500x2600

convert guys.jpg -resize 5500x2600 guys.jpg

我现在可以做一些测试......首先,简单的调整大小

/usr/bin/time -l convert guys.jpg -resize 500x334 small.jpg
        0.85 real         0.79 user         0.05 sys
 178245632  maximum resident set size                    <--- 178 MB
         0  average shared memory size
         0  average unshared data size
         0  average unshared stack size
     44048  page reclaims
         0  page faults
         0  swaps

你可以看到它在我的Mac上使用了178 MB的峰值。

如果我现在使用“Shrink on Load”功能,我提到:

/usr/bin/time -l convert -define jpeg:size=500x334 guys.jpg -resize 500x334 small.jpg
        0.06 real         0.04 user         0.00 sys
   8450048  maximum resident set size                 <--- Only 8 MB
         0  average shared memory size
         0  average unshared data size
         0  average unshared stack size
      2381  page reclaims
        33  page faults
         0  swaps

你可以看到它现在只需要8MB。它也更快!