PHP海报生成文字图片合成类

前言:将二维码放到背景图中(生成二维码的方法在前文中已经讲了>>传送门<<)

1.调用

   $parmams=[
        'code_path'=>'public/static/images/code.png',//二维码路径
        'bg_img_path'=>'public/static/images/background.png',//待合成的背景图路径
        'out_file_path'=>"'public/static/images/result/"  . time(). '.png',//合成后的图片输出路径
        'title'=>'海报的文字描述',//可为空
   ];
  $result = $this->mix($parmams);
  
  public function mix(Request $request){
	  
	    $codePath = $params['code_path'];
        $bgImgPath = $params['bg_img_path'];
        $outFilePath = $params['out_file_path'];
        $title = $params['title'];

        //图片合成
        $configPost = array(
            //要加上的图
            'image' => array(
                array(
                    'url'     => $codePath,       
                    'left'    => 152,			//二维码距离左边像素
                    'top'     => 343,			//二维码距离上边像素
                    'stream'  => 0,             //图片资源是否是字符串图像流
                    'right'   => 0,
                    'bottom'  => 0,
                    'width'   => 340,
                    'height'  => 340,
                    'opacity' => 70
                ),
            ),
             'text'=>array(
                array(
                    'text'=>'',
                    'left'=>0,
                    'top'=>0,
                    'fontPath'=>'simhei.ttf',  //字体文件(或simhei.ttf,冷门字体中文可能乱码)
                    'fontSize'=>20,          //字号
                    'fontColor'=>'255,255,255',   //字体颜色
                    'angle'=>0,
                )
            ),
            //背景图
            'background' =>  $bgImgPath,       
        );
        $this->createPoster($configPost, $outFilePath);

        output_success($outFilePath);
    }

2.合成类


    /**
     * 图片合成方法
     * @param array  参数,包括图片和文字
     * @param string  $filename 生成文件名,不传此参数则不生成文件,直接输出图片
     * @return [type] [description]
     */
    public function createPoster($config = array(), $filename = "")
    {
        //如果要看报什么错,可以先注释调这个header
        // if(empty($filename)) header("content-type: image/png");
        $imageDefault = array(
            'left' => 0,
            'top' => 0,
            'right' => 0,
            'bottom' => 0,
            'width' => 100,
            'height' => 100,
            'opacity' => 100
        );

        $textDefault = array(
            'text' => '',
            'left' => 0,
            'top' => 0,
            'fontSize' => 32,       //字号
            'fontColor' => '255,255,255', //字体颜色
            'angle' => 0,
        );
        $background = $config['background']; //最底层得背景
        //背景方法
        $backgroundInfo = getimagesize($background);
        $backgroundFun = 'imagecreatefrom' . image_type_to_extension($backgroundInfo[2], false);
        $background = $backgroundFun($background);
        $backgroundWidth = imagesx($background);  //背景宽度
        $backgroundHeight = imagesy($background);  //背景高度
        $imageRes = imageCreatetruecolor($backgroundWidth, $backgroundHeight);
        $color = imagecolorallocate($imageRes, 0, 0, 0);
        imagefill($imageRes, 0, 0, $color);
        // imageColorTransparent($imageRes, $color);  //颜色透明
        imagecopyresampled($imageRes, $background, 0, 0, 0, 0, imagesx($background), imagesy($background), imagesx($background), imagesy($background));
        //处理了图片
        if (!empty($config['image'])) {
            foreach ($config['image'] as $key => $val) {
                $val = array_merge($imageDefault, $val);
                $info = getimagesize($val['url']);

                $function = 'imagecreatefrom' . image_type_to_extension($info[2], false);
                if ($val['stream']) {   //如果传的是字符串图像流
                    $info = getimagesizefromstring($val['url']);
                    $function = 'imagecreatefromstring';
                }
                $res = $function($val['url']);
                $resWidth = $info[0];
                $resHeight = $info[1];
                //建立画板 ,缩放图片至指定尺寸
                $canvas = imagecreatetruecolor($val['width'], $val['height']);
                imagefill($canvas, 0, 0, $color);
                //关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
                imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'], $resWidth, $resHeight);
                $val['left'] = $val['left'] < 0 ? $backgroundWidth - abs($val['left']) - $val['width'] : $val['left'];
                $val['top'] = $val['top'] < 0 ? $backgroundHeight - abs($val['top']) - $val['height'] : $val['top'];
                //放置图像
                imagecopymerge($imageRes, $canvas, $val['left'], $val['top'], $val['right'], $val['bottom'], $val['width'], $val['height'], $val['opacity']); //左,上,右,下,宽度,高度,透明度
            }
        }

        //处理文字
        if (!empty($config['text'])) {
            foreach ($config['text'] as $key => $val) {
                $val = array_merge($textDefault, $val);
                list($R, $G, $B) = explode(',', $val['fontColor']);
                $fontColor = imagecolorallocate($imageRes, $R, $G, $B);
                $val['left'] = $val['left'] < 0 ? $backgroundWidth - abs($val['left']) : $val['left'];
                $val['top'] = $val['top'] < 0 ? $backgroundHeight - abs($val['top']) : $val['top'];
                imagettftext($imageRes, $val['fontSize'], $val['angle'], $val['left'], $val['top'], $fontColor, $val['fontPath'], $val['text']);
            }
        }

        //生成图片
        if (!empty($filename)) {
            $res = imagejpeg($imageRes, $filename, 90); //保存到本地
            imagedestroy($imageRes);
            if (!$res) return false;
            return $filename;
        } else {
            imagejpeg($imageRes);     //在浏览器上显示
            imagedestroy($imageRes);
        }
    }

你可能感兴趣的:(小功能,php,php,开发语言,后端)