我正在尝试使用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)
问题解决了
JYe*_*ton 13
您的一个或多个图像可能实际上在原始内存中膨胀到16M.检查的一种方法是在Photoshop或Irfanview中打开它并检查颜色空间和像素尺寸.
例如,考虑一个"低"的600万像素摄像头,它不需要达到16M.它创建了一个3072像素乘2048像素的图像.每个颜色的字节数(RGB),原始大小为:
3072 x 2048 x 3 = 18,874,368
因此,您可能希望根据预期处理的最大图像增加内存.但你必须考虑他们的原始尺寸.