PHP多张图片合成一张

需求

将不定量的图片合成一张图片

代码

首先贴出在网上找到的一个可以用的版本

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实现了图片生成

评论