Я здесь новый, так что это будет мой первый пост!Слияние нескольких изображений как один в 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);
}
?>
Спасибо за ваш быстрый ответ Освальд! Причина $ image_new заключается в том, что исходное изображение иногда больше 612. Если я не использую его, а исходное изображение больше, то оно обрезается с правой и нижней стороны. Есть ли другой способ решить это? –
Это странно, [документация для 'imagecopyresampled()'] (http://php.net/manual/en/function.imagecopyresampled.php) ничего не говорит об обрезке. Вы уверены, что посмотрели на правильную страницу документации? – Oswald
Извините, моя ошибка! Я обновил свой пост выше с обновленным кодом. Все та же проблема. Наиболее трудоемким кажется imagecreatefromjpeg() и getimagesize(). Есть ли способ улучшить это? –