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连接Oracle for NT 远程数据库
Oct 09 PHP
PHP原理之异常机制深入分析
Aug 08 PHP
基于php实现长连接的方法与注意事项的问题
May 10 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
php提示Failed to write session data错误的解决方法
Dec 17 PHP
PHP制作万年历
Jan 07 PHP
使用PHP生成PDF方法详解
Jan 23 PHP
如何使用微信公众平台开发模式实现多客服
Jan 06 PHP
ThinkPHP模板循环输出Volist标签用法实例详解
Mar 23 PHP
Windows上php5.6操作mongodb数据库示例【配置、连接、获取实例】
Feb 13 PHP
详解如何实现Laravel的服务容器的方法示例
Apr 15 PHP
laravel框架路由分组,中间件,命名空间,子域名,路由前缀实例分析
Feb 18 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的Widget扩展实例
2014/06/19 PHP
Linux下PHP加速器APC的安装与配置笔记
2014/10/24 PHP
基础的WordPress插件制作教程
2015/11/24 PHP
js获取input标签的输入值实现代码
2013/08/05 Javascript
JQuery设置文本框和密码框得到焦点时的样式
2013/08/30 Javascript
无刷新预览所选择的图片示例代码
2014/04/02 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
JavaScript实现计算字符串中出现次数最多的字符和出现的次数
2015/03/12 Javascript
基于nodejs+express(4.x+)实现文件上传功能
2015/11/23 NodeJs
js实现的彩色方块飞舞奇幻效果
2016/01/27 Javascript
JavaScript开发Chrome浏览器扩展程序UI的教程
2016/05/16 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
js实现无缝滚动图
2017/02/22 Javascript
jQuery控制元素隐藏和显示
2017/03/03 Javascript
微信小程序 同步请求授权的详解
2017/08/04 Javascript
jQuery实现验证表单密码一致性及正则表达式验证邮箱、手机号的方法
2017/12/05 jQuery
Node.js实现简单的爬取的示例代码
2019/06/25 Javascript
如何在项目中使用log4.js的方法步骤
2019/07/16 Javascript
vue与iframe之间的信息交互的实现
2020/04/08 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
vscode自定义vue模板的实现
2021/01/27 Vue.js
[01:32:10]NAVI vs VG Supermajor 败者组 BO3 第一场 6.5
2018/06/06 DOTA
Python排序算法之选择排序定义与用法示例
2018/04/29 Python
Python实现获取前100组勾股数的方法示例
2018/05/04 Python
对Django 中request.get和request.post的区别详解
2019/08/12 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
HTML+CSS+JavaScript实现图片3D展览的示例代码
2020/10/12 HTML / CSS
10条PHP编程习惯
2014/05/26 面试题
Collection和Collections的区别
2016/05/02 面试题
干部培训自我鉴定
2014/01/22 职场文书
九年级体育教学反思
2014/01/23 职场文书
医院领导班子四风对照检查材料
2014/09/27 职场文书
关于运动会的广播稿50字
2014/10/17 职场文书
诚信教育主题班会
2015/08/13 职场文书
如何使用PyCharm及常用配置详解
2021/06/03 Python
PHP中国际化的字符串排序和比较对象详解
2021/08/23 PHP