PHP实现生成推广海报的方法详解


Posted in PHP onMarch 14, 2018

本文实例讲述了PHP实现生成推广海报的方法。分享给大家供大家参考,具体如下:

经常有这样的需求,就是需要在生成推广海报,包含指定的二维码,分享出去别人扫码之后就可以确定用户推荐关系。

仔细分析一下,推广海报必要的要素就是海报背景图和二维码,这两者都容易生成,但要两者结合到一起组合成为一张图二维还要可以保存到本地便于分享出去,这就是难点了,在H5中可以借助canvas画出来完成类似于截图的功能,但放到小程序里边很多局限性。那么我们直接在后台生成海报,前台直接调用。

前期准备:

1.海报背景图,背景图一般存服务器,程序本地读取;
2.推广二维码,可以是二维码图片链接,也可以是字符串图像流,如果自己生成二维码,详见:使用phpqrcode生成二维码。

方法如下:

/**
 * 生成宣传海报
 * @param array  参数,包括图片和文字
 * @param string  $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片
 * @return [type] [description]
 */
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);
  }
}

使用示例一:生成带有二维码的海报

$config = array(
  'image'=>array(
    array(
      'url'=>'qrcode/qrcode.png',     //二维码资源
      'stream'=>0,
      'left'=>116,
      'top'=>-216,
      'right'=>0,
      'bottom'=>0,
      'width'=>178,
      'height'=>178,
      'opacity'=>100
    )
  ),
  'background'=>'bg/bg1.jpg'          //背景图
);
$filename = 'bg/'.time().'.jpg';
//echo createPoster($config,$filename);
echo createPoster($config);

PHP实现生成推广海报的方法详解

使用示例二:生成带有图像,昵称和二维码的海报

$config = array(
  'text'=>array(
    array(
      'text'=>'昵称',
      'left'=>182,
      'top'=>105,
      'fontPath'=>'qrcode/simhei.ttf',     //字体文件
      'fontSize'=>18,             //字号
      'fontColor'=>'255,0,0',       //字体颜色
      'angle'=>0,
    )
  ),
  'image'=>array(
    array(
      'url'=>'qrcode/qrcode.png',       //图片资源路径
      'left'=>130,
      'top'=>-140,
      'stream'=>0,             //图片资源是否是字符串图像流
      'right'=>0,
      'bottom'=>0,
      'width'=>150,
      'height'=>150,
      'opacity'=>100
    ),
    array(
      'url'=>'https://wx.qlogo.cn/mmopen/vi_32/DYAIOgq83eofD96opK97RXwM179G9IJytIgqXod8jH9icFf6Cia6sJ0fxeILLMLf0dVviaF3SnibxtrFaVO3c8Ria2w/0',
      'left'=>120,
      'top'=>70,
      'right'=>0,
      'stream'=>0,
      'bottom'=>0,
      'width'=>55,
      'height'=>55,
      'opacity'=>100
    ),
  ),
  'background'=>'qrcode/bjim.jpg',
);
$filename = 'qrcode/'.time().'.jpg';
//echo createPoster($config,$filename);
echo createPoster($config);

PHP实现生成推广海报的方法详解

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
用PHP制作静态网站的模板框架(四)
Oct 09 PHP
php中使用ExcelFileParser处理excel获得数据(可作批量导入到数据库使用)
Aug 21 PHP
关于php支持分块与断点续传文件下载功能代码
May 09 PHP
教你如何开启shopnc b2b2c 伪静态
Oct 21 PHP
PHP框架Laravel学习心得体会
Oct 28 PHP
使用PHP similar text计算两个字符串相似度
Nov 06 PHP
php实现的http请求封装示例
Nov 08 PHP
Yii2下session跨域名共存的解决方案
Feb 04 PHP
PHP魔术方法之__call与__callStatic使用方法
Jul 23 PHP
Phpstorm+Xdebug断点调试PHP的方法
May 14 PHP
Laravel-admin之修改操作日志的方法
Sep 30 PHP
解决PhpStorm64不能启动的问题
Jun 20 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 #PHP
PHP判断是否是微信打开,浏览器打开的方法
Mar 14 #PHP
Laravel模型事件的实现原理详解
Mar 14 #PHP
PHP实现根据数组某个键值大小进行排序的方法
Mar 13 #PHP
Laravel多用户认证系统示例详解
Mar 13 #PHP
PHP简单实现防止SQL注入的方法
Mar 13 #PHP
PHP+JS实现的实时搜索提示功能
Mar 13 #PHP
You might like
php include的妙用,实现路径加密
2008/07/29 PHP
php curl 伪造IP来源的实例代码
2012/11/01 PHP
PHPMailer邮件发送的实现代码
2013/05/04 PHP
探讨PHP使用eAccelerator的API开发详解
2013/06/09 PHP
php像数组一样存取和修改字符串字符
2014/03/21 PHP
ThinkPHP表单令牌错误的相关解决方法分析
2016/05/20 PHP
JS实现打开本地文件或文件夹
2021/03/09 Javascript
基于JavaScript实现 获取鼠标点击位置坐标的方法
2013/04/12 Javascript
纯JS实现五子棋游戏兼容各浏览器(附源码)
2013/04/24 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
JS+CSS实现可拖动的弹出提示框
2015/02/16 Javascript
JS实现模拟百度搜索“2012世界末日”网页地震撕裂效果代码
2015/10/31 Javascript
jQuery ajax调用后台aspx后台文件的两种常见方法(不是ashx)
2016/06/28 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
折叠菜单及选择器的运用
2017/02/03 Javascript
gulp加批处理(.bat)实现ng多应用一键自动化构建
2017/02/16 Javascript
JS变量及其作用域
2017/03/29 Javascript
jacascript DOM节点——元素节点、属性节点、文本节点
2017/04/18 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
JS实现的透明度渐变动画效果示例
2018/04/28 Javascript
5分钟教你用nodeJS手写一个mock数据服务器的方法
2019/09/10 NodeJs
vue源码中的检测方法的实现
2019/09/26 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
Python脚本简单实现打开默认浏览器登录人人和打开QQ的方法
2016/04/12 Python
巧用python和libnmapd,提取Nmap扫描结果
2016/08/23 Python
Python 结巴分词实现关键词抽取分析
2017/10/21 Python
python 根据时间来生成唯一的字符串方法
2019/01/14 Python
Python操作dict时避免出现KeyError的几种解决方法
2020/09/20 Python
Python调用Redis的示例代码
2020/11/24 Python
Airbnb爱彼迎官网:成为爱彼迎房东,赚取收入
2019/03/14 全球购物
升职自荐信范文
2013/10/05 职场文书
计算机专业个人简短的自我评价
2013/10/23 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
党员志愿者活动总结
2014/06/26 职场文书
储备店长岗位职责
2015/04/14 职场文书
大队委员竞选稿
2015/11/20 职场文书