需求
将不定量的图片合成一张图片
代码
首先贴出在网上找到的一个可以用的版本
function mergePics($pics) {
$height_max = 0;
$pics_new = array();
foreach ($pics as $k => $v) {
$img_info = getimagesize($v);
$widths[] = $img_info[0];
$height_max += $img_info[1];
$pics_new[$k]['pic'] = $v;
$pics_new[$k]['width'] = $img_info[0];
$pics_new[$k]['height'] = $img_info[1];
}
$width_max = max($widths);
$merge_img = imagecreatetruecolor($width_max, $height_max);
$trans_colour = imagecolorallocatealpha($merge_img, 255, 255, 255, 127);
imagefill($merge_img, 0, 0, $trans_colour);
$height = 0;
foreach ($pics_new as $k => $v) {
if ($k == 0) {
imagecopyresized($merge_img, imagecreatefromjpeg($v['pic']), 0, 0, 0, 0, $v['width'], $v['height'], $v['width'], $v['height']);
} else {
imagecopyresized($merge_img, imagecreatefromjpeg($v['pic']), 0, $height, 0, 0, $v['width'], $height, $v['width'], $height);
}
$height += $v['height'];
}
$pic_heti = 'heti.jpg';
imagejpeg($merge_img, $pic_heti);
return $pic_heti;
}
$pics = array("1.jpg", "2.jpg", "3.jpg");
$heti = mergePics($pics);
但在本次开发中不满足实际需求,实际需求是需要横向排列,上个函数生成的图片是纵向排列,且生成的图片名称一致,会出现覆盖现象,经优化后代码如下:
function mergePics($pics){
if (!is_array($pics) || empty($pics)) return "";
$pics_new = [];
$widths_max = 0;
$height = [];
foreach ($pics as $k => $v) {
$img_info = getimagesize($v);
$widths_max += $img_info[0];
$height[] = $img_info[1];
$pics_new[$k]['pic'] = $v;
$pics_new[$k]['width'] = $img_info[0];
$pics_new[$k]['height'] = $img_info[1];
}
$height_max = max($height);
$merge_img = imagecreatetruecolor($widths_max, $height_max);
$trans_colour = imagecolorallocatealpha($merge_img, 255, 255, 255, 127);
imagefill($merge_img, 0, 0, $trans_colour);
$widths = 0;
foreach ($pics_new as $k => $v) {
if ($k == 0) {
imagecopyresized($merge_img, imagecreatefromjpeg($v['pic']), 0, 0, 0, 0, $v['width'], $v['height'], $v['width'], $v['height']);
} else {
imagecopyresized($merge_img, imagecreatefromjpeg($v['pic']), $widths, 0, 0, 0, $widths, $v['height'], $widths, $v['height']);
}
$widths += $v['width'];
}
$dir = './uploads/img_merge';
is_dir($dir) OR mkdir($dir, 0777, true);
$time = time();
$file_dir = "{$dir}/{$time}.png";
$merge_result = imagejpeg($merge_img, $file_dir);
return $merge_result ? $file_dir : "";
}
然后实际开发中还是没有满足需求,最后通过js实现了图片生成