2013-07-20 37 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現在。它也更快!