在 PHP 中将多个图像合并为一个 - 慢功能



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

我在下面有这个功能,即将四个图像合并为一个。它可以工作,但需要将近 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); 

}  
?>

更新如下:

我改为图像复制重新采样并摆脱了$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);

}
?>

不需要中间$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()将帮助您做到这一点。

最新更新