在PHP中将多个图像合并为一个图像-慢速函数
我是新来的,所以这将是我的第一篇帖子 我在下面有一个函数,将四个图像合并成一个。它可以工作,但几乎需要20秒。有没有办法加快速度?感谢所有的帮助在PHP中将多个图像合并为一个图像-慢速函数,php,image,merge,Php,Image,Merge,我是新来的,所以这将是我的第一篇帖子 我在下面有一个函数,将四个图像合并成一个。它可以工作,但几乎需要20秒。有没有办法加快速度?感谢所有的帮助 <?php $images = $_GET['i']; $nb = $_GET['nb']; if ($nb == '4') { $dest = imagecreatefrompng('files/template_collage_' . $nb . '.png'); $image_files = explode('|'
<?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\u 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\u 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
);
}
此外,如果一个复杂的操作花费的时间太长,第一步是测量复杂操作的哪一部分实际负责这一点。一些位置合适的电话将有助于您解决这一问题。感谢您的快速回复,奥斯瓦尔德!$image_new的原因是源图像有时大于612。如果我不使用它,并且源图像较大,则会在右侧和底部进行裁剪。有没有其他方法可以解决这个问题呢?这很奇怪,这本书并没有提到种植。你确定你看了正确的文档页吗?对不起,我错了!我已经用更新的代码编辑了上面的帖子。还是一样的问题。最耗时的似乎是imagecreatefromjpeg()和getimagesize()。有什么办法可以改进吗?你所说的似乎是什么意思?你测量了还是没有测量?如果
getimagesize()
花费的时间太长,请使用及其垂直同级来确定图像的大小。这避免了对图像文件进行两次解析。我确实对它进行了测量。我将getimagesize()替换为imagesx()和imagesy(),它将总加载时间从大约17秒减少到大约8秒。在这8秒钟中,imagecreatefromjpeg()现在大约是5秒钟。