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 相关文章推荐
DOMXML函数笔记
Oct 09 PHP
main.php
Dec 09 PHP
php 异常处理实现代码
Mar 10 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
Nov 04 PHP
PHP 双链表(SplDoublyLinkedList)简介和使用实例
May 12 PHP
php socket通信简单实现
Nov 18 PHP
php 5.4 全新的代码复用Trait详解
Jan 05 PHP
PHP7多线程搭建教程
Apr 21 PHP
TP3.2批量上传文件或图片 同名冲突问题的解决方法
Aug 01 PHP
PHP分享图片的生成方法
Apr 25 PHP
Laravel学习笔记之Artisan命令生成自定义模板的方法
Nov 22 PHP
详解Laravel设置多态关系模型别名的方式
Oct 17 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调用MySQL存储过程的方法集合(推荐)
2013/07/03 PHP
PHP图像处理之imagecreate、imagedestroy函数介绍
2014/11/19 PHP
PHP的Yii框架中YiiBase入口类的扩展写法示例
2016/03/17 PHP
php生成毫秒时间戳的实例讲解
2017/09/22 PHP
PHP单元测试配置与使用方法详解
2019/12/27 PHP
javascript之通用简单的table选项卡实现(二)
2010/05/09 Javascript
javascript中最常用的继承模式 组合继承
2010/08/12 Javascript
Extjs4 GridPanel的主要配置参数详细介绍
2013/04/18 Javascript
Jquery AJAX POST与GET之间的区别
2013/11/14 Javascript
js 立即调用的函数表达式如何写
2014/01/12 Javascript
Javascript原型链和原型的一个误区
2014/10/22 Javascript
使用Sticker.js实现贴纸效果
2015/01/28 Javascript
JavaScript String 对象常用方法总结
2016/04/28 Javascript
如何让你的JS代码更好看易读
2017/12/01 Javascript
原生js调用json方法总结
2018/02/22 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
微信小程序结合Storage实现搜索历史效果
2019/05/18 Javascript
vue3自定义dialog、modal组件的方法
2021/01/04 Vue.js
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
fastcgi文件读取漏洞之python扫描脚本
2017/04/23 Python
Django ManyToManyField 跨越中间表查询的方法
2018/12/18 Python
python处理multipart/form-data的请求方法
2018/12/26 Python
使用Python 统计高频字数的方法
2019/01/31 Python
python的一些加密方法及python 加密模块
2019/07/11 Python
CSS3中媒体查询结合rem布局适配手机屏幕
2019/06/10 HTML / CSS
BookOutlet加拿大:在网上书店购买廉价折扣图书和小说
2018/10/05 全球购物
硅酸盐工业控制专业应届生求职信
2013/11/02 职场文书
新闻记者个人求职的自我评价
2013/11/28 职场文书
临床医师专业个人自我评价
2014/01/08 职场文书
分公司经理任命书
2014/06/05 职场文书
医德医风自我评价2015
2015/03/03 职场文书
2015年检验科工作总结
2015/04/27 职场文书
热血教师观后感
2015/06/10 职场文书
2015年七夕情人节感言
2015/08/03 职场文书
pycharm2021激活码使用教程(永久激活亲测可用)
2021/03/30 Python
SQL Server Agent 服务无法启动
2022/04/20 SQL Server