我已经编写了这个小函数来生成更大的jpg / jpeg / png源的缩略图,并且它在jpg / jpeg图像上完美运行,但是根据png图像的大小,会使函数崩溃。不确定点。小的300x200图像工作,但像2880x1800的东西不会。
这是我的(注释)功能:
function make_thumb($filename, $destination, $desired_width) {
$extension = pathinfo($filename, PATHINFO_EXTENSION);
// Read source image
if ($extension == 'jpg' || $extension == 'jpeg') {
$source_image = imagecreatefromjpeg($filename);
} else if ($extension == 'png') {
$source_image = imagecreatefrompng($filename); // I think the crash occurs here.
} else {
return 'error';
}
$width = imagesx($source_image);
$height = imagesy($source_image);
$img_ratio = floor($height / $width);
// Find the "desired height" of this thumbnail, relative to the desired width
$desired_height = floor($height * ($desired_width / $width));
// Create a new "virtual" image
$virtual_image = imagecreatetruecolor($desired_width, $desired_height);
// Copy source image at a resized size
imagecopyresampled($virtual_image, $source_image, 0, 0, 0, 0, $desired_width, $desired_height, $width, $height);
// Create the physical thumbnail image to its destination
if ($extension == 'jpg' || $extension == 'jpeg') {
$source_image = imagejpeg($virtual_image, $destination);
} else if ($extension == 'png') {
$source_image = imagepng($virtual_image, $destination, 1);
} else {
return 'another error';
}
}
我发现的唯一提到类似问题的文档是this。这是我的问题吗?有解决方案吗为什么这样做?
答案 0 :(得分:1)
你很可能内存不足。 2880 x 1800真彩色需要大约20兆字节。
检查你的php.ini是否为memory_limit
。
答案 1 :(得分:1)
imagepng()
的PHP文档here的评论说:
我的脚本无法完成:致命错误:允许的内存大小为XX字节耗尽(尝试分配XX + n字节)。
我发现PHP以未压缩格式处理图像:我的输入图像是8768x4282 @ 32 bit =>每个内存中的副本大约150 MB。
作为一种解决方案,您可以检查尺寸并拒绝任何太大的尺寸,或者像我一样,使用ini_set('memory_limit','1024M');在页面上开始(如果您的服务器有足够的板载内存)。
所以,请记住使用ini_set('memory_limit','1024M');
!!!