2013-07-12 44 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是文件系统压缩后的文件大小。我认为与解决方案有关的另一个线索是,每当我打开文件时,我的粉丝就会在短时间内发出短促的声音,这是奇怪的是这样一个小文件(并且花费更长时间打开该文件)..再次感谢:) –