2013-07-20 75 views
1

的图像是小于1MB但大小大致是5500x3600。我正试图将图片大小调整为小于500x500。我的代码非常简单。PHP - imagecreatefromjpeg使用100M记忆<1M图像

$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采用100M使用memory_get_usage。

有没有更好的方式来做到imagecreatefromjpeg?有没有解决方法或使用较少内存的不同功能?

我没问我的服务器管理员增加内存,但我怀疑他们将它提高到100M以上。我正在考虑限制图像的尺寸,用户可以上传,但没有用尽我所有的选择,因为用户很可能会上传图片,他们把之前。

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

enter image description here

+0

什么在$ _POST ['imageSource']'? –

+0

它是图像的来源。我将其更改为upload/1.jpg进行调试。由于该部分不相关,我将删除它。 – khuderm

+6

使用'5500x3600'时,内存中至少需要5500 * 3600 * 4个字节=〜80MB。对于大图片Imagick扩展可能会有更好的性能比GD –

回答

2

什么@开发无效居民说的是正确答案:

随着5500x3600你会内存中至少需要5500 * 3600 * 4个字节=〜80MB。对于大图片,Imagick扩展可能比GD有更好的性能

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

如果您有权访问ImageMagick,则使用库/命令行客户端可能会更好 - 当您使用run ImageMagick from the command line时,其内存使用量不会计入内存限制。无论你是否可以这样做,你都需要从你的虚拟主机或服务器管理员那里找到答案。

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

+0

有很多方法可以改进。例如,可以将JPEG的大小减半(或四分之一等)而无需解码。 – nwellnhof

+0

@nwellnhof也许,但不使用GD,不是? (不管是用什么工具,我都会对你所描述的资源感兴趣。 –

+0

有些工具可以直接在DCT系数上运行,比如'jpegtran'。但为了节省内存,您只需要一种方法来逐个处理解码器的输出。不过,GD和ImageMagick都不支持这种操作方式。 – nwellnhof

0

ImageMagick的,在命令行至少,能够使用的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的峰值。

如果我现在使用的“收缩上加载”功能,我提到:

/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现在。它也更快!