php 图片合成

<?php

//图片合并
class imageMix
{
    public $bg_w = 250; // 背景图片宽度
    public $bg_h = 250; // 背景图片高度

    /**
     * 组合图片
     * @param $image_set
     * @param $image_number
     */
    public function imageSynthesis($image_set, $image_number)
    {
        // 背景图片
        $background = imagecreatetruecolor($this->bg_w, $this->bg_h);

        // 为真彩色画布创建白色背景,再设置为透明
        $color = imagecolorallocate($background, 202, 201, 201);

        //区域填充
        imagefill($background, 0, 0, $color);

        //将某个颜色定义为透明色
        imageColorTransparent($background, $color);

        //随机从set中取出指定数量的图片
        shuffle($image_set);
        $pic_list = array_slice($image_set, 0, $image_number);


        $pic_count = count($pic_list);

        $lineArr = array(); // 需要换行的位置
        $space_x = 3;
        $space_y = 3;
        $line_x = 0;

        $p = sqrt($image_number);//3
        $i = sqrt($image_number) + 1;//4
        $j = sqrt($image_number) - 1;//2
        switch ($pic_count) {
            case $pic_count:
                $start_x = 5; // 开始位置X
                $start_y = 5; // 开始位置Y
                $pic_w = intval($this->bg_w / $p) - 4.1; // 宽度
                $pic_h = intval($this->bg_h / $p) - 4.1; // 高度
                $lineArr = $this->getNumArray($image_number);
                $line_x = 5;
                break;
        }

        foreach ($pic_list as $k => $pic_path) {
            $kk = $k + 1;
            if (in_array($kk, $lineArr)) {
                $start_x = $line_x;
                $start_y = $start_y + $pic_h + $space_y;
            }
            $pathInfo = pathinfo($pic_path);

            switch (strtolower($pathInfo['extension'])) {
                case 'jpg':
                case 'jpeg':
                    $imagecreatefromjpeg = 'imagecreatefromjpeg';
                    break;
                case 'png':
                    $imagecreatefromjpeg = 'imagecreatefrompng';
                    break;
                case 'gif':
                default:
                    $imagecreatefromjpeg = 'imagecreatefromstring';
                    $pic_path = file_get_contents($pic_path);
                    break;
            }
            $resource = $imagecreatefromjpeg($pic_path);

            // $start_x,$start_y copy图片在背景中的位置
            // 0,0 被copy图片的位置
            // $pic_w,$pic_h copy后的高度和宽度
            imagecopyresized($background, $resource, $start_x, $start_y, 0, 0, $pic_w, $pic_h, imagesx($resource), imagesy($resource)); // 最后两个参数为原始图片宽度和高度,倒数两个参数为copy时的图片宽度和高度
            $start_x = $start_x + $pic_w + $space_x;
        }

        header("Content-type: image/jpg");
        imagejpeg($background);
        imagegif($background, "./hero_gam.png");

    }

    /**
     * 计算换行的位置
     * @param $image_number
     * @return array
     */
    function getNumArray($image_number)
    {

        $image_num = sqrt($image_number);

        if (floor($image_num) == $image_num) {
            $arr = [];
            for ($i = $image_num - 1; $i > 0; $i--) {
                $arr[] = $image_number - ($image_num * $i) + 1;
            }

            return $arr;

        } else {
            echo "false";
        }
    }
}

$obj = new imageMix();
$image_set = array(
    './images/1.jpg',
    './images/2.jpg',
    './images/3.jpg',
    './images/4.jpg',
    './images/5.jpg',
    './images/6.jpg',
    './images/7.jpg',
    './images/8.jpg',
    './images/9.jpg',
    './images/10.jpg',
    './images/11.jpg',
    './images/12.jpg',
    './images/13.jpg',
    './images/14.jpg',
    './images/15.jpg',
    './images/16.jpg',
    './images/17.jpg',
    './images/18.jpg',
    './images/19.jpg',
    './images/20.jpg',
    './images/21.jpg',
    './images/22.jpg',
    './images/23.jpg',
    './images/24.jpg',
    './images/25.jpg',
    './images/26.jpg',
);
$image_number = 25;

$obj->bg_w=300;
$obj->bg_h=300;
$res = $obj->imageSynthesis($image_set, $image_number);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值