2013-07-12 69 views
0

我正嘗試將圖像上傳到我創建的應用程序中。 .png圖像在文件系統中佔用約190KB,分辨率爲2000px寬,1667px高。我爲32MB設置了PHP的內存限制。 但是當我嘗試上傳這個PNG圖片,我相信很多人使用我的應用程序會做什麼,我發現了以下錯誤PNG上傳錯誤 - 分配的內存大小錯誤

Allowed memory size of 33554432 bytes exhausted (tried to allocate 13336000 bytes) 

現在,當我計算到這些說我MB瞭解,它讀

Allowed memory size of 32MB exhausted (tried to allocate 12.71MB) 

因此,我不明白是怎麼來的一個文件,該文件顯示文件系統的大小190KB的最終佔用了這麼多的內存空間?是不是有關如何處理內存中的.png文件,我不知道?

下面是代碼

private function optimise_image($source_path, $destination_path){ 
    list($source_image_width, $source_image_height, $source_image_type) = getimagesize($source_path); 
    //Using this source path, we'll create a memory instance of the image for processing 
    $source_image_ratio = $source_image_width/$source_image_height; 
    switch ($source_image_type) { 
     case IMAGETYPE_GIF: 
      $source_gd_image = imagecreatefromgif($source_path); 
      break; 
     case IMAGETYPE_JPEG: 
      $source_gd_image = imagecreatefromjpeg($source_path); 
      break; 
     case IMAGETYPE_PNG: 
      $source_gd_image = imagecreatefrompng($source_path); 
      break; 
    } 

誤差是發生在imagecreatefrompng()。我在這裏加載圖像以降低分辨率,並設置圖像質量以優化存儲和查看帶寬。

經過進一步調查,我發現文件正在上傳,服務器上的文件大小再次爲190KB。所以你看到的那段代碼是它試圖再次拿起文件進行處理的地方。在此之前,沒有在哪裏文件被加載到內存一次,然後離開那裏沒有被破壞(我認爲會發生什麼)

如果有任何更多的信息,你可能需要,做問我和我會盡量相應地回答。預先:)每像素

+2

發表一些代碼,以獲得更好的想法。 – Rikesh

+0

使用ini_set('memory_limit','200M')像這樣設置內存大小 – Sundar

+0

@Sundar爲什麼您需要200M來處理190Kb的圖像? – tlenss

回答

2

圖像寬x圖像高度×4個字節(32位)

由於需要只爲imagecreatefrompng/imagecreatefromjpeg

所以這是大致12MB你的情況

GD lib和其他PHP進程只剩下20MB。

+0

是的。這是我正在尋找的答案。知道它是如何歸結爲字節和位是非常有趣的。感謝您給予理解的答案。所以我猜190KB是文件系統壓縮後的文件大小。我認爲與解決方案有關的另一個線索是,每當我打開文件時,我的粉絲就會在短時間內發出短促的聲音,這是奇怪的是這樣一個小文件(並且花費更長時間打開該文件)..再次感謝:) –