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 静态变量与自定义常量的使用方法
Jan 26 PHP
PHP Undefined index报错的修复方法
Jul 17 PHP
php中如何防止表单的重复提交
Aug 02 PHP
Linux中用PHP判断程序运行状态的2个方法
May 04 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
php设计模式之简单工厂模式详解
Sep 04 PHP
PHP利用header跳转失效的解决方法
Oct 24 PHP
thinkphp判断访客为手机端或PC端的方法
Nov 24 PHP
php实现xml与json之间的相互转换功能实例
Jul 07 PHP
关于ThinkPhp 框架表单验证及ajax验证问题
Jul 19 PHP
用PHP的反射实现委托模式的讲解
Mar 22 PHP
PHP实现rar解压读取扩展包小结
Jun 03 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
ThinkPHP CURD方法之order方法详解
2014/06/18 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
解决jquery版本冲突的有效方法
2014/09/02 Javascript
js实现微信分享代码
2020/10/11 Javascript
js判断价格,必须为数字且不能为负数的实现方法
2016/10/07 Javascript
JavaScript随机生成颜色的方法
2016/10/15 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
bootstrap轮播图示例代码分享
2017/05/17 Javascript
webpack-dev-server远程访问配置方法
2018/02/22 Javascript
js实现树形数据转成扁平数据的方法示例
2020/02/27 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
[01:00:26]Ti4主赛事胜者组第一天 EG vs NEWBEE 1
2014/07/19 DOTA
Python3实现发送QQ邮件功能(html)
2017/12/15 Python
python中使用%与.format格式化文本方法解析
2017/12/27 Python
基于DATAFRAME中元素的读取与修改方法
2018/06/08 Python
python图像和办公文档处理总结
2019/05/28 Python
python全栈要学什么 python全栈学习路线
2019/06/28 Python
python+django+rest框架配置创建方法
2019/08/31 Python
Python使用scipy模块实现一维卷积运算示例
2019/09/05 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
python标准库OS模块详解
2020/03/10 Python
基于python实现获取网页图片过程解析
2020/05/11 Python
python可视化 matplotlib画图使用colorbar工具自定义颜色
2020/12/07 Python
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
美国女士内衣在线折扣商店:One Hanes Place
2019/03/24 全球购物
如何使用PHP session
2015/04/21 面试题
中专生的个人自我评价
2013/12/11 职场文书
高中生自我评语大全
2014/01/19 职场文书
小学生家长评语集锦
2014/01/30 职场文书
《大禹治水》教学反思
2014/04/27 职场文书
房产遗嘱范本
2015/08/06 职场文书
三八节祝酒词
2015/08/11 职场文书
毕业生求职自荐信(2016最新版)
2016/01/28 职场文书