PHP 使用 GD 创建动态图像

Posted

技术标签:

【中文标题】PHP 使用 GD 创建动态图像【英文标题】:PHP Create dynamic Images with GD 【发布时间】:2014-07-10 16:27:33 【问题描述】:

我用 php 编写了一个用于创建和裁剪图像的函数。我加载图像列表(超过 500 张图像)在 foreach 循环中动态创建和裁剪这些图像。

我在 PHP >= 5.5 中使用新的裁剪功能进行了尝试:

resource imagecrop ( resource $image , array $rect )

这个函数有问题,因为它在创建的图像的底部添加了一条黑线。但是我可以使用这个函数在 foreach 循环中根据需要创建很多图像。

https://bugs.php.net/bug.php?id=67447&edit=3

我的函数使用 imagecrop

function createAndSaveImage($imagePath, $targetName)
    $imagesize = getimagesize($imagePath);
    $imagewidth = $imagesize[0];
    $imageheight = $imagesize[1];
    $imagetype = $imagesize[2];
    switch ($imagetype)
        case 1: // GIF 
            $image = imagecreatefromgif($imagePath);
            break;
        case 2: // JPEG 
            $image = imagecreatefromjpeg($imagePath);
            break;
        case 3: // PNG 
            $image = imagecreatefrompng($imagePath);
            break;
        default:
            return false;
    
    $rect = array();
    $rect["x"] = 230;
    $rect["y"] = 140;
    $rect["width"] = 40;
    $rect["height"] = 30;
    $thumb = imagecrop( $image , $rect );
    if( $imagetype == IMAGETYPE_PNG )
        imagepng($thumb, $targetName,9);
    else
        imagejpeg($thumb, $targetName,100);
        
    return true;

现在我尝试使用 imagecopyimagecopyresampled 而不是 imagecrop

我在 foreach 循环中调用我的函数。它会创建 goog 裁剪图像(底部没有黑线),但是在 300 个项目(有时更多)之后它总是会中断。

我的函数使用 imagecopyimagecopyresampled:

function createAndSaveImage($imagePath, $targetName)
    $imagesize   = getimagesize($imagePath);
    $imagewidth  = $imagesize[0];
    $imageheight = $imagesize[1];
    $imagetype   = $imagesize[2];
    switch ($imagetype)
        case 1: // GIF 
            $image = imagecreatefromgif($imagePath);
            break;
        case 2: // JPEG 
            $image = imagecreatefromjpeg($imagePath);
            break;
        case 3: // PNG 
            $image = imagecreatefrompng($imagePath);
            break;
        default:
            return false;
    
    $thumbwidth = 40;
    $thumbheight = 30;
    $thumb = imagecreatetruecolor($thumbwidth, $thumbheight);
    imagecopy($thumb, $image, 0, 0, 230, 140, $imagewidth, $imageheight);
    //imagecopyresampled( $thumb, $image, 0, 0, 230, 140, $imagewidth, $imageheight, $imagewidth, $imageheight );
    if( $imagetype == IMAGETYPE_PNG )
        imagepng($thumb, $targetName,9);
    else
        imagejpeg($thumb, $targetName,100);
    
    imagedestroy($thumb);
    return true;

知道为什么吗?是内存/缓存问题吗?

更新 [phpInfo]:

max_execution_time         0    30
max_file_uploads          20    20
max_input_nesting_level   64    64
max_input_time            -1    -1
max_input_vars          1000    1000
memory_limit            128M    128M

第一个值:本地值

第二个价值:主价值

非常感谢

【问题讨论】:

【参考方案1】:

这听起来像是一个最大执行时间问题。尝试在脚本顶部添加set_time_limit(0);,或更改php.ini 中max_execution_time 的值。

【讨论】:

感谢您的回答。我添加了 set_time_limit(0);到我脚本的顶部。但它仍然无法正常工作,请查看我在问题中的更新! 超时需要多长时间?它仍然可能是一个超时问题(有时您无法覆盖该设置)。或者它可能是记忆。尝试在 foreach 循环中添加 echo memory_get_peak_usage(true) . "<br/>"; 并发布显示的最大数字。 memory_get_peak_usage(true)的最大数为5505024 时间量呢?多久会死?屏幕上或错误日志中是否有任何错误消息? 没有错误或任何警告,它会在 14.9 秒后死亡/中断

以上是关于PHP 使用 GD 创建动态图像的主要内容,如果未能解决你的问题,请参考以下文章

动态图像处理

PHP动态图像处理

动态GD图像宽度文字

PHP动态图像的创建要如何实现呢?

如何使用 php gd 库加载动态图像,不将其保存在服务器上或使用 src="script.php"?

动态背景图片 PHP GD