php实现微信中的图片合并 (圆角) -九宫格图片实现

<?php
    /**
     * 根据图片数组  拼接成九宫格式拼图
     * @param  array   $pic_list [带拼成的图片数组]
     * @param  integer $bg_w     [背景图片宽度]
     * @param  integer $bg_h     [背景图片高度]
     * @param  string  $format   [阿里云图片获取参数]
     * @return [type]            [返回一个拼接好的图片(路径)]
     */
    function mosaicGroupAvatar($pic_list = array(),$bg_w = 500,$bg_h=500,$format="@0e_320w_320h_0c_0i_1o_90Q_1x.jpg"){
        $pic_list       = array(
            'http://image.microinvestment.cn/avatar/ios_13409C7D-0499-40D7-8EF8-242636833E1C_1432009249.534474.png',
            'http://image.microinvestment.cn/avatar/1d11f7cf-d345-4b66-809c-df4f9fb44900.png',
            'http://image.microinvestment.cn/avatar/241e049f-791b-49e0-a041-7b95720a4eb2.jpg',
            'http://image.microinvestment.cn/avatar/6737e039-167e-4c4f-8915-616d0fe6c471.jpg',
            'http://image.microinvestment.cn/avatar/1d11f7cf-d345-4b66-809c-df4f9fb44900.png',
            'http://image.microinvestment.cn/avatar/ios_192DA9F1-47C2-4593-8390-731DD8A6E4A6_1432038578.595966.png',
            'http://image.microinvestment.cn/avatar/ios_0C9B935A-8ACA-43A7-A5F9-70FCE8032499_1434365804.095018.png',
            'http://image.microinvestment.cn/avatar/default.png',
            'http://image.microinvestment.cn/avatar/14f7ebcb-f522-4cb0-b9c2-adca25e536f2.jpg',
        );
  
        $pic_list    = array_slice($pic_list, 0, 9); // 只操作前9个图片  

        $background = imagecreatetruecolor($bg_w,$bg_h); // 背景图片  

        $color   = imagecolorallocate($background, 216, 216, 216); // 为真彩色画布创建白色背景,再设置为透明
        imagefill($background, 0, 0, $color);           //区域填充  
        imageColorTransparent($background, $color);     // 将某个颜色定义为透明色
  
        $pic_count  = count($pic_list);
        $lineArr    = array();  // 需要换行的位置
        $space_x    = 3;
        $space_y    = 3;
        $line_x  = 0;
        switch($pic_count) {
            case 1: // 正中间
                $start_x = intval($bg_w/4);  // 开始位置X
                $start_y = intval($bg_h/4);  // 开始位置Y
                $pic_w   = intval($bg_w/2); // 宽度
                $pic_h   = intval($bg_h/2); // 高度
                break;
            case 2: // 中间位置并排
                $start_x = 2;
                $start_y = intval($bg_h/4) + 3;
                $pic_w   = intval($bg_w/2) - 5;
                $pic_h   = intval($bg_h/2) - 5;
                $space_x = 5;
                break;
            case 3:
                $start_x = 124;   // 开始位置X
                $start_y = 5;    // 开始位置Y
                $pic_w   = intval($bg_w/2) - 5; // 宽度
                $pic_h   = intval($bg_h/2) - 5; // 高度
                $lineArr = array(2);
                $line_x  = 4;
                break;
            case 4:
                $start_x = 4;    // 开始位置X
                $start_y = 5;    // 开始位置Y
                $pic_w   = intval($bg_w/2) - 5; // 宽度
                $pic_h   = intval($bg_h/2) - 5; // 高度
                $lineArr = array(3);
                $line_x  = 4;
                break;
            case 5:
                $start_x = 85.5;   // 开始位置X
                $start_y = 85.5;   // 开始位置Y
                $pic_w   = intval($bg_w/3) - 5; // 宽度
                $pic_h   = intval($bg_h/3) - 5; // 高度
                $lineArr = array(3);
                $line_x  = 5;
                break;
            case 6:
                $start_x = 5;    // 开始位置X
                $start_y = 85.5;   // 开始位置Y
                $pic_w   = intval($bg_w/3) - 5; // 宽度
                $pic_h   = intval($bg_h/3) - 5; // 高度
                $lineArr = array(4);
                $line_x  = 5;
                break;
            case 7:
                $start_x = 166.5;   // 开始位置X
                $start_y = 5;    // 开始位置Y
                $pic_w   = intval($bg_w/3) - 5; // 宽度
                $pic_h   = intval($bg_h/3) - 5; // 高度
                $lineArr = array(2,5);
                $line_x  = 5;
                break;
            case 8:
                $start_x = 80.5;   // 开始位置X
                $start_y = 5;    // 开始位置Y
                $pic_w   = intval($bg_w/3) - 5; // 宽度
                $pic_h   = intval($bg_h/3) - 5; // 高度
                $lineArr = array(3,6);
                $line_x  = 5;
                break;
            case 9:
                $start_x = 5;    // 开始位置X
                $start_y = 5;    // 开始位置Y
                $pic_w   = intval($bg_w/3) - 5; // 宽度
                $pic_h   = intval($bg_h/3) - 5; // 高度
                $lineArr = array(4,7);
                $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;
            }

            $resource     = imagecreatefromjpeg($pic_path.$format);            
            $image_width  = imagesx($resource);  
            $image_height = imagesy($resource); 
   
            // 图片圆角处理  
            $radius     = 50; //20   40-貌似不错   50也不错
            // lt(左上角)  
            $lt_corner  = get_lt_rounder_corner($radius); 
            imagecopymerge($resource, $lt_corner, 0, 0, 0, 0, $radius, $radius, 100); 

            // lb(左下角)  
            $lb_corner  = imagerotate($lt_corner, 90, 0);  
            imagecopymerge($resource, $lb_corner, 0, $image_height - $radius, 0, 0, $radius, $radius, 100);  
  
            // rb(右上角)  
            $rb_corner  = imagerotate($lt_corner, 180, 0);  
            imagecopymerge($resource, $rb_corner, $image_width - $radius, $image_height - $radius, 0, 0, $radius, $radius, 100);  
            // rt(右下角)  
            $rt_corner  = imagerotate($lt_corner, 270, 0);  
            imagecopymerge($resource, $rt_corner, $image_width - $radius, 0, 0, 0, $radius, $radius, 100); 


            // $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;
        }

        $fname= date('YmdHis').rand(100,999);
  
        $imagePath = './Public/Temp/'.$fname.'.jpg';
   
        header("Content-type: image/jpg");
        // imagejpeg($background);

        // 保存图像为 $imagePath.'$fname'.'.jpg'
        $res = imagejpeg($background,$imagePath); 

        if (false === $res) {
            return false;
        } 

        // 释放内存
        imagedestroy($background);
        
        return $imagePath;   
    }
 
    /**
     * [产生一个弧角图片]
     * @param  [type] $radius [弧度]
     * @return [type]         [description]
     */
    function get_lt_rounder_corner($radius) {  
        // $radius:弧角图片的大小  
        $img        = imagecreatetruecolor($radius, $radius);  
        $bgcolor    = imagecolorallocate($img, 223, 223, 223);  
        // $bgcolor    = imagecolorallocate($img, 216, 216, 216);  
        $fgcolor    = imagecolorallocate($img, 0, 0, 0);  
        imagefill($img, 0, 0, $bgcolor);  
        // $radius,$radius:以图像的右下角开始画弧  
        // $radius*2, $radius*2:已宽度、高度画弧  
        // 180, 270:指定了角度的起始和结束点  
        // fgcolor:指定颜色  
        imagefilledarc($img, $radius, $radius, $radius*2, $radius*2, 180, 270, $fgcolor, IMG_ARC_PIE);  
        // 设置颜色为透明  
        imagecolortransparent($img, $fgcolor);  
        return $img;  
    }  
?>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值