超出允许的内存大小:134217728字节(尝试分配18472字节)

3
我在这一行遇到了上述错误:

我在这一行遇到了上述错误:

imagefill($canvas, 0, 0, imagecolorallocate($canvas, 255, 255, 255));

脚本对所有图像类型均可正常工作,但对分辨率大于4000 x 3000像素的图像会崩溃。图像本身只有500kb。

以下是完整代码:

$canvas = imagecreatetruecolor(imagesx($source), imagesy($source));
imagefill($canvas, 0, 0, imagecolorallocate($canvas, 255, 255, 255));
imagealphablending($canvas, TRUE);
imagecopy($canvas, $source, 0, 0, 0, 0, imagesx($source), imagesy($source));
imagedestroy($source);
$quality = 100; // 0 = worst / smaller file, 100 = better / bigger file 
imagejpeg($canvas, $strPath.$p_Id.".jpg", $quality);        //----- save image
ImageDestroy($canvas);

在内存中仅存储该图像需要48MB,假设图像大小为4000像素x 3000像素,每个像素占用4字节。这还没有开始对其进行操作,如果你复制图像,那么就会有多个48MB的副本在内存中...所以达到限制也就不足为奇了。 - Mark Baker
500KB仅是应用有损压缩后的文件大小。如果您需要操作图片,您必须在内存中分配它们。 - Álvaro González
3个回答

5

无论压缩图像的大小是多少,似乎你的库需要更多的内存。我看到你目前使用的是128MB,将其增加到256MB,可以使用以下方法:

ini_set('memory_limit','256M');

脚本的顶部很好。 - Angel Iliikov
当然。你应该接受我的答案,这样人们就不会再回复了 :) - Angel Iliikov

1

我会使用以下代码覆盖PHP中的默认内存限制:

ini_set('memory_limit', '-1');

0

无论压缩图像的大小如何,似乎您的库需要更多的内存。我看到您目前正在使用128 mb,将其增加到最大值。

ini_set('memory_limit', 0);

2
PHP文档表示,它期望的是-1而不是零。这个答案已经由derdida提供了。 - Gerd K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接