2013-11-10 6 views
0

Я здесь новый, так что это будет мой первый пост!Слияние нескольких изображений как один в 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); 


} 

?> 

UPDATE НИЖЕ:

я изменил 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); 


} 

?> 

ответ

0

Там нет необходимости в промежуточном $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() помогут вам в этом.

+0

Спасибо за ваш быстрый ответ Освальд! Причина $ image_new заключается в том, что исходное изображение иногда больше 612. Если я не использую его, а исходное изображение больше, то оно обрезается с правой и нижней стороны. Есть ли другой способ решить это? –

+0

Это странно, [документация для 'imagecopyresampled()'] (http://php.net/manual/en/function.imagecopyresampled.php) ничего не говорит об обрезке. Вы уверены, что посмотрели на правильную страницу документации? – Oswald

+0

Извините, моя ошибка! Я обновил свой пост выше с обновленным кодом. Все та же проблема. Наиболее трудоемким кажется imagecreatefromjpeg() и getimagesize(). Есть ли способ улучшить это? –

Смежные вопросы