【问题标题】:Merging multiple images as one in PHP - slow function在PHP中将多个图像合并为一个-慢速功能
【发布时间】:2013-11-10 13:13:56
【问题描述】:

我是新来的,所以这将是我的第一篇文章!

我下面有这个功能,就是将四张图片合二为一。它有效,但需要将近 20 秒。有什么办法可以加快这个速度吗?感谢所有帮助!

<?php

$images = $_GET['i']; 
$nb = $_GET['nb']; 

if ($nb == '4') { 
   $dest = imagecreatefrompng('files/template_collage_' . $nb . '.png'); 
    $image_files = explode('|', $images); 
    $i = 1; 

    foreach ($image_files as $image_file) { 

        $image_source = imagecreatefromjpeg($image_file); 
        $size = getimagesize($image_file); 
        $image_new = imagecreatetruecolor(612,612); 
        imagecopyresampled($image_new,$image_source,0,0,0,0,612,612,$size[0],$size[1]); 

        if ($i == 1) { 
            imagecopymerge($dest, $image_new, 0, 0, 0, 0, 612, 612, 100); 

        } else if ($i == 2) { 
            imagecopymerge($dest, $image_new, 612, 0, 0, 0, 612, 612, 100); 

        } else if ($i == 3) { 
            imagecopymerge($dest, $image_new, 0, 612, 0, 0, 612, 612, 100); 

        } else if ($i == 4) { 
            imagecopymerge($dest, $image_new, 612, 612, 0, 0, 612, 612, 100); 

        } 

        $i++; 

        imagedestroy($image_source); 
        imagedestroy($image_new); 
        $size = ''; 
    } 


    // Output and free from memory 
    header('Content-Type: image/png'); 
    header('Content-Disposition: inline; filename=collage_card.png'); 
    imagejpeg($dest, null, 100); 

    imagedestroy($dest); 


}  

?>

以下更新:

我更改为 imagecopyresampled 并摆脱了 $image_new。仍然没有改善,每个循环大约需要 4.5 秒。

<?php

if ($nb == '4') {

$dest = imagecreatefrompng('files/template_collage_' . $nb . '.png');
$image_files = explode('|', $images);
$i = 1;

foreach ($image_files as $image_file) {

    $image_source = imagecreatefromjpeg($image_file);
    $size = getimagesize($image_file);

    if ($i == 1) {
        imagecopyresampled($dest, $image_source, 0, 0, 0, 0, 612, 612, $size[0],$size[1]);

    } else if ($i == 2) {
        imagecopyresampled($dest, $image_source, 612, 0, 0, 0, 612, 612, $size[0],$size[1]);

    } else if ($i == 3) {
        imagecopyresampled($dest, $image_source, 0, 612, 0, 0, 612, 612, $size[0],$size[1]);

    } else if ($i == 4) {
        imagecopyresampled($dest, $image_source, 612, 612, 0, 0, 612, 612, $size[0],$size[1]);

    }

    $i++;

    imagedestroy($image_source);
    $size = '';
}


// Output and free from memory
header('Content-Type: image/jpeg');
header('Content-Disposition: inline; filename=collage_card.jpg');
imagejpeg($dest, null, 100);

imagedestroy($dest);


}

?>

【问题讨论】:

    标签: php image merge


    【解决方案1】:

    不需要中间的$image_new

    if ($i == 2) {
      imagecopyresampled($dest, $image_source,
        612, 0,           // target position
        0, 0,             // source position
        612, 612,         // target size
        $size[0],$size[1] // source size
      );
    }
    

    另外,如果一个复杂的操作花费的时间太长,第一步是衡量复杂操作的哪一部分实际上是负责的。对microtime() 的一些适当的呼叫将帮助您。

    【讨论】:

    • 感谢您的快速回答奥斯瓦尔德! $image_new 的原因是源图像有时大于 612。如果我不使用它并且源图像更大,那么它在右侧和底部被裁剪。有没有其他方法可以解决这个问题?
    • 这很奇怪,documentation for imagecopyresampled() 没有说明任何关于裁剪的内容。您确定您查看了正确的文档页面吗?
    • 对不起,我的错!我已经用更新的代码编辑了我上面的帖子。还是同样的问题。最耗时的似乎是 imagecreatefromjpeg() 和 getimagesize()。有什么办法可以改善吗?
    • 你说的似乎是是什么意思?你量过还是没量过?如果getimagesize() 花费的时间太长,请使用imagesx() 及其垂直兄弟来确定图像的大小。这样可以避免两次解析图像文件。
    • 我确实测量了它。我用 imagesx() 和 imagesy() 替换了 getimagesize(),它将总加载时间从大约 17 秒减少到大约 8 秒。在这 8 秒中,imagecreatefromjpeg() 现在大约是 5 秒。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 2014-07-18
    • 1970-01-01
    • 2022-11-07
    • 2016-04-15
    • 1970-01-01
    相关资源
    最近更新 更多