海报 自定义海报(PHP GD 二维码 压缩图片)

需求:生成海报(需要有二维码,相关文字)

A , B , C, D 这四大个点的内容需要是变化的
D:一般是设计的二维码

主方法:

//生成邀请卡
public function index()
{
    //接收参数
    $params=$this->input->post();
    //查询相关数据
    $result =  '';
    //时间
    $time = "海报时间";

    //获取http协议
    if(isset($_SERVER['HTTP_X_CLIENT_SCHEME'])){
        $scheme = $_SERVER['HTTP_X_CLIENT_SCHEME'] . '://';
    }elseif(isset($_SERVER['REQUEST_SCHEME'])){
        $scheme = $_SERVER['REQUEST_SCHEME'] . '://';
    }else{
        $scheme = 'http://';
    }

    //域名
    $domain =  $_SERVER['SERVER_NAME'] ;
    //二维码地址
    $url="";
    //获取水印生成图片
    $codeurl= $this->watermark($url,$params['live_id'],'',$params['bg_type']);
    //头像地址
    $codeparams['headimg'] = '';
    //背景图片(底图)
    $codeparams['background'] = '';
    //时间
    $codeparams['time'] = $time;
    //图片
    $codeparams['sponsor'] = '';
    //标题
    $codeparams['title'] = '';
    //表示id
    $codeparams['live_id'] = ;
 

 

    //缩略
    $this->pic($codeparams);
     //合成图片
       $pic = $this->compicture($codeurl,$codeparams,'show',$params['bg_type']);
       //返回参数
       if($pic){
           //返回值(url数据,展示输出)
           //获取http协议
           if(isset($_SERVER['HTTP_X_CLIENT_SCHEME'])){
               $scheme = $_SERVER['HTTP_X_CLIENT_SCHEME'] . '://';
           }elseif(isset($_SERVER['REQUEST_SCHEME'])){
               $scheme = $_SERVER['REQUEST_SCHEME'] . '://';
           }else{
               $scheme = 'http://';
           }
           //域名
           $domain =  $_SERVER['SERVER_NAME'] ;
           //获取其他参数
           $url = $scheme.$domain.$pic;
           $rebackdata['url'] = $url;
           ajaxReturn(['status'=>'0','msg'=>'成功','data'=>$rebackdata]);
       }else{
           ajaxReturn(['status'=>'1','msg'=>'失败','data'=>'']);
       }
     }

/***********************************公共方法开始*********************************/
   //生成缩略图
   public function pic($params){
       //创建文件夹
       $path_dir = "";
       if (!is_dir($path_dir)) {
           mkdir($path_dir, 0777, true);
       }
       //获取图片,生成缩略图
       $sponsorold = imagecreatefromstring(file_get_contents(ltrim($params['sponsor'],'/')));
       $sponsorxWidthold = imagesx($sponsorold);
       $sponsoryWidthold = imagesy($sponsorold);
       $new_width = $sponsorxWidthold*0.3;
       $new_height =$sponsoryWidthold*0.3;
       $this->imagepress($params['sponsor'], $new_width, $new_height,$params['live_id']);
   }


   //生成二维码
   function watermark($url, $live_id,$show,$type){
       //地址
       $bg_img_url = str_replace('\\', '/', strstr(__DIR__, 'app', true));
       //图片获取
       $bg_img = $bg_img_url . '相对地址';

       //背景图片获取到画布
       $img = imagecreatefromstring(file_get_contents($bg_img));
       //获取画布宽度(计算文字横向距离)
       $imgWidth = imagesx($img);

       $size = intval($imgWidth * 0.006);
       //清除缓存区
       ob_clean();
       //应用三方
       $this->load->library('Qrcode');
       //二维码内容
       $errorCorrectionLevel = 'L';//容错级别
       $matrixPointSize = $size;//生成图片大小
       //生成二维码图片
       $path_dir = "保存地址";
       if (!is_dir($path_dir)) {
           mkdir($path_dir, 0777, true);
       }
       //合成文件路径
       if($show){
           $filename = $path_dir.'/'.$live_id.'show'.'.png';
       }else{
           $filename = $path_dir.'/'.$live_id.'.png';
       }


       //删除旧文件
       if(file_exists($filename)){
           unlink($filename);
       }
       //重新生成文件
       if(!file_exists($filename))
       {
           QRcode::png($url,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
           $QR = $filename;        //已经生成的原始二维码图片文件
           $QR = imagecreatefromstring(file_get_contents($QR));
       }
       //返回存储地址
       if($show){
           $rebackurl = '/存储相对路径/'.$live_id.'show'.'.png';
       }else{
           $rebackurl = '/存储相对路径/'.$live_id.'.png';
       }

       return $rebackurl;
   }


   //合成图片
   function compicture($codeurl,$params,$show,$bg_type=1){

       //背景图片(根据$bg_type的组合)
       $bg_img_url = str_replace('\\', '/', strstr(__DIR__, 'app', true));

      $bg_img = $bg_img_url . '相对地址';

       //字体路径
       $font_xk = $bg_img_url . 'static/font/msyhdb.TTF';
       //背景图片获取到画布
       $img = imagecreatefromstring(file_get_contents($bg_img));
       if($bg_type==6){
           $blacktitle = 45;//字体颜色 RGB 标题
           $black = 25;//字体颜色 RGB
       }else{
           $blacktitle = imagecolorallocate($img, 17,115,215);//字体颜色 RGB 标题
           $black = imagecolorallocate($img, 0,0,0);//字体颜色 RGB
       }

       //获取画布宽度(计算文字横向距离)
       $imgWidth = imagesx($img);
       //获取画布高度(计算文字竖向高度)
       $imgheight = imagesy($img);

       //字体大小(普通)
       $pubfontsize = $imgheight * 0.022;
       //计算间距
       $spacingsix = $imgheight * 0.0102;

       //背景
       $background = imagecreatefromstring(file_get_contents($params['background']));
       $backgroundWidth = imagesx($background);
       $backgroundx = ($imgWidth-$backgroundWidth)/1.9;
       $backgroundy = $imgheight*0.1;
       imagecopymerge($img, $background, $backgroundx, $backgroundy, 0,0, imagesx($background), imagesy($background), 100);


       //logo
       $headimg = imagecreatefromstring(file_get_contents($params['headimg']));
       $headimgWidth = imagesx($headimg);
       $headimgx = ($imgWidth-$headimgWidth)/1.9;
       $headimgy = $imgheight*0.1;
       imagecopymerge($img, $headimg, $headimgx, $headimgy, 0,0, imagesx($headimg), imagesy($headimg), 100);

       //渲染项目图片
       $sponsornew = 'upload/invitation_ugc/kv/7943.png';
       $sponsor = imagecreatefromstring(file_get_contents($sponsornew));
       $sponsorWidth = imagesx($sponsor);
       $sponsorx = ($imgWidth-$sponsorWidth)/2;
       $sponsory = $imgheight*0.35;
       imagecopymerge($img, $sponsor, $sponsorx, $sponsory, 0,0, imagesx($sponsor), imagesy($sponsor), 100);

       //二维码合并
       $image_2 = imagecreatefromstring(file_get_contents($codeurl));
       $img2Width = imagesx($image_2);
       $img2x = ($imgWidth-$img2Width)/1.96;
       $img2y = $imgheight*0.63;
       imagecopymerge($img, $image_2, $img2x, $img2y, 0,0, imagesx($image_2), imagesy($image_2), 100);

       //渲染标题(邀请你一起观看直播)
       $title = '邀请你一起观看直播';
       //获取文字宽度
       $titlex = ($imgWidth-$spacingsix*strlen($title))/1.96;
       //获取文字高度
       $titley = $imgheight*0.25;
       imagefttext($img, $pubfontsize, 0, $titlex, $titley, $blacktitle, $font_xk, $title);

       //渲染时间
       $time =$params['time'];
       //获取文字宽度
       $timex = ($imgWidth-$spacingsix*strlen($time))/1.85;
       $timey = $imgheight*0.3;
       $textsize =  $imgheight * 0.015;
       imagefttext($img, $textsize, 0, $timex, $timey, $black, $font_xk, $time);


       //渲染标题(需要分段:如果字符过长需要折中渲染)
       $title = $params['title'];

       //切分数据
       $chunkdata = $this->chunkstr($title,'10','12');

       //第一行数据
       if($chunkdata[0]){
           //获取文字高度
           $titley = $imgheight*0.56;
           imagefttext($img, $pubfontsize, 0, $sponsorx, $titley, $black, $font_xk, $chunkdata[0]);
       }
       //第二行数据
       if($chunkdata[1]){
           $titley = $imgheight*0.6;
           imagefttext($img, $pubfontsize, 0, $sponsorx, $titley, $black, $font_xk, $chunkdata[1]);
       }

       //渲染标题(长按识别二维码参加直播)
       $address ='长按识别二维码参加直播';
       //获取文字宽度
       $addressx = $imgWidth*0.33;
       $addressy = $imgheight*0.8;
       $addresssize =  $imgheight * 0.013;
       imagefttext($img, $addresssize, 0, $addressx, $addressy, $black, $font_xk, $address);


       //地址(图片合成后的保存地址)
       $path = $bg_img_url . '海报生成后保存地址';

       //创建文件
       if (!is_dir($path)) {
           mkdir($path, 0777, true);
       }
       //标志(正式区使用live_id)
       if($show){
           $manage_id = $params['live_id'].'show';
       }else{
           $manage_id = $params['live_id'];
       }
       //文件加上水印
       $upload = $path . '/' . $manage_id . '.jpg';

       //合成图片并保存
       imagejpeg($img, $upload);
       imagedestroy($img);

       //返回相对地址
       $returnurl = '相对路径'.$manage_id.'.jpg';
       return $returnurl;
   }

   //压缩图片
   public function imagepress($filepath, $new_width, $new_height,$live_id)
   {
       //获取http协议
       if(isset($_SERVER['HTTP_X_CLIENT_SCHEME'])){
           $scheme = $_SERVER['HTTP_X_CLIENT_SCHEME'] . '://';
       }elseif(isset($_SERVER['REQUEST_SCHEME'])){
           $scheme = $_SERVER['REQUEST_SCHEME'] . '://';
       }else{
           $scheme = 'http://';
       }
       //域名
       $domain =  $_SERVER['SERVER_NAME'] ;
       //获取其他参数
       $filepath = $scheme.$domain.$filepath;

       $source_info   = getimagesize($filepath);
       $source_width  = $source_info[0];
       $source_height = $source_info[1];
       $source_mime   = $source_info['mime'];
       $source_ratio  = $source_height / $source_width;
       $target_ratio  = $new_height / $new_width;
       // 源图过高
       if ($source_ratio > $target_ratio)
       {
           $cropped_width  = $source_width;
           $cropped_height = $source_width * $target_ratio;
           $source_x = 0;
           $source_y = ($source_height - $cropped_height) / 2;
       }
       // 源图过宽
       elseif ($source_ratio < $target_ratio)
       {
           $cropped_width  = $source_height / $target_ratio;
           $cropped_height = $source_height;
           $source_x = ($source_width - $cropped_width) / 2;
           $source_y = 0;
       }
       // 源图适中
       else
       {
           $cropped_width  = $source_width;
           $cropped_height = $source_height;
           $source_x = 0;
           $source_y = 0;
       }

       switch ($source_mime)
       {
           case 'image/gif':
               $source_image = imagecreatefromgif($filepath);
               break;
           case 'image/jpeg':
               $source_image = imagecreatefromjpeg($filepath);
               break;
           case 'image/png':
               $source_image = imagecreatefrompng($filepath);
               break;
           default:
               return false;
               break;
       }
       $target_image  = imagecreatetruecolor($new_width, $new_height);
       $cropped_image = imagecreatetruecolor($cropped_width, $cropped_height);
       // 裁剪
       imagecopy($cropped_image, $source_image, 0, 0, $source_x, $source_y, $cropped_width, $cropped_height);
       // 缩放
       imagecopyresampled($target_image, $cropped_image, 0, 0, 0, 0, $new_width, $new_height, $cropped_width, $cropped_height);
       header('Content-Type: image/jpeg');
       imagejpeg($target_image,'./upload/invitation_ugc/kv/'.$live_id.'.png');
       imagedestroy($source_image);
       imagedestroy($target_image);
       imagedestroy($cropped_image);
   }

   //切割长度(切割指定数据并且不能出现切割错误)
   public function chunkstr($string,$len,$lenmore){
       $start = 0;
       $strlen = mb_strlen($string);
       while ($strlen) {
           if(empty($array)){
               $array[] = mb_substr($string,$start,$len,"utf8");
               $string = mb_substr($string, $len, $strlen,"utf8");
               $strlen = mb_strlen($string);
           }else{
               $array[] = mb_substr($string,$start,$lenmore,"utf8");
               $string = mb_substr($string, $lenmore, $strlen,"utf8");
               $strlen = mb_strlen($string);
           }
       }
       return $array;
   }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值