PHP GD允许的内存大小耗尽

gur*_*un8 11 php gd

我正在尝试使用PHP:GD来处理JPEG图像目录(大约600+,范围从50k到500k)以调整大小并保存图像,但我在这个过程中很早就遇到了一些障碍.正确处理3个图像(30K,18K和231K)后,我得到一个允许的内存大小16777216字节耗尽 PHP致命错误.

我正在循环浏览图像并调用以下代码:

    list($w, $h) = getimagesize($src);

    if ($w > $it->width) {
        $newwidth = $it->width;
        $newheight = round(($newwidth * $h) / $w);
    } elseif ($w > $it->height) {
        $newheight = $it->height;
        $newwidth = round(($newheight * $w) / $h);
    } else {
        $newwidth = $w;
        $newheight = $h;
    }

    // create resize image
    $img = imagecreatetruecolor($newwidth, $newheight);
    $org = imagecreatefromjpeg($src);

    // Resize
    imagecopyresized($img, $org, 0, 0, 0, 0, $newwidth, $newheight, $w, $h);
    imagedestroy($org);

    imagejpeg($img, $dest);

    // Free up memory
    imagedestroy($img);
Run Code Online (Sandbox Code Playgroud)

我试图用这个imagedestroy函数释放内存,但似乎没有任何影响.该脚本始终不断地阻塞imagecreatefromjpeg代码行.

我检查了php.ini,memory_limit = 16M设置好像是正确的.但我无法弄清楚为什么内存会填满.它不应该将内存释放回垃圾收集器吗?我真的不想增加memory_limit设置.这似乎是一个糟糕的解决方法,可能会在未来导致更多问题.

仅供参考:我正在从命令提示符运行我的脚本.它不应该影响功能,但可能会影响您的响应,所以我想我应该提一下.

任何人都可以看到我是否只是遗漏了一些简单的东西,或者这里是否存在设计缺陷?你认为这将是一个非常简单的任务.当然这必须是可能的,对吧?

Tra*_*isO 18

ini_set('memory_limit', '64M');
Run Code Online (Sandbox Code Playgroud)

问题解决了

  • 我想我应该刚刚发布了做什么,而不是为什么这样做. (5认同)

JYe*_*ton 13

您的一个或多个图像可能实际上在原始内存中膨胀到16M.检查的一种方法是在Photoshop或Irfanview中打开它并检查颜色空间和像素尺寸.

例如,考虑一个"低"的600万像素摄像头,它不需要达到16M.它创建了一个3072像素乘2048像素的图像.每个颜色的字节数(RGB),原始大小为:

3072 x 2048 x 3 = 18,874,368

因此,您可能希望根据预期处理的最大图像增加内存.但你必须考虑他们的原始尺寸.

  • 并且gd不仅每个像素存储三个而是四个字节~25M (3认同)