PHP:根据PNG大小从PNG源崩溃函数生成PNG缩略图

时间:2013-02-25 02:59:14

标签: php image png thumbnails

我已经编写了这个小函数来生成更大的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。这是我的问题吗?有解决方案吗为什么这样做?

2 个答案:

答案 0 :(得分:1)

你很可能内存不足。 2880 x 1800真彩色需要大约20兆字节。

检查你的php.ini是否为memory_limit

答案 1 :(得分:1)

我是个白痴。那或PHP在处理大型PNG图像时非常糟糕。来自imagepng()的PHP文档here的评论说:

  

我的脚本无法完成:致命错误:允许的内存大小为XX字节耗尽(尝试分配XX + n字节)。

     

我发现PHP以未压缩格式处理图像:我的输入图像是8768x4282 @ 32 bit =>每个内存中的副本大约150 MB。

     

作为一种解决方案,您可以检查尺寸并拒绝任何太大的尺寸,或者像我一样,使用ini_set('memory_limit','1024M');在页面上开始(如果您的服务器有足够的板载内存)。

所以,请记住使用ini_set('memory_limit','1024M'); !!!

来增加可用内存限制