0

我正在尝试将图像上传到我正在创建的应用程序中。.png 图像在文件系统中占用大约 190KB,分辨率为 2000px 宽和 1667 px 高。我已将 PHP 的内存限制设置为 32MB。但是当我尝试上传这个我相信很多使用我的应用程序的人都会这样做的 .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。因此,您看到的这段代码是它试图再次获取文件进行处理的地方。在此之前,文件被加载到内存中一次然后离开那里而不被破坏的过程中没有任何地方(我认为这是会发生的事情)

如果您可能需要更多信息,请询问我,我将尝试相应地回答。

提前致谢 :)

4

1 回答 1

2

仅 imagecreatefrompng / imagecreatefromjpeg 需要每像素图像宽度 x 图像高度 x 4 字节(32 位)

所以在你的情况下大约是 12MB

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

于 2013-07-12T13:28:48.733 回答