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 从数据库提取二进制图片的处理代码
Sep 09 PHP
Thinkphp实现MySQL读写分离操作示例
Jun 25 PHP
PHP实现对站点内容外部链接的过滤方法
Sep 10 PHP
Yii的CDbCriteria查询条件用法实例
Dec 04 PHP
PHP中iconv函数转码时截断字符问题的解决方法
Jan 21 PHP
php开发工具有哪五款
Nov 09 PHP
PHP目录操作实例总结
Sep 27 PHP
PHP+jquery+CSS制作头像登录窗(仿QQ登陆)
Oct 20 PHP
php实现的网页版剪刀石头布游戏示例
Nov 25 PHP
PHP ADODB实现事务处理功能示例
May 25 PHP
laravel5.1框架基础之Blade模板继承简单使用方法分析
Sep 05 PHP
thinkphp5实现微信扫码支付
Dec 23 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
在任意字符集下正常显示网页的方法一
2007/04/01 PHP
PHP面向对象程序设计之类常量用法实例
2014/08/20 PHP
php技术实现加载字体并保存成图片
2015/07/27 PHP
WordPress中给文章添加自定义字段及后台编辑功能区域
2015/12/19 PHP
PHP 实现手机端APP支付宝支付功能
2018/06/07 PHP
javascript 获取元素位置的快速方法 getBoundingClientRect()
2009/11/26 Javascript
FF火狐下获取一个元素同类型的相邻元素实现代码
2012/12/15 Javascript
JS判断文本框内容改变事件的简单实例
2014/03/07 Javascript
js获取下拉列表的值和元素个数示例
2014/05/07 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
js实现文本框支持加减运算的方法
2015/08/19 Javascript
javascript检测移动设备横竖屏
2016/05/21 Javascript
JQuery 选择器、DOM节点操作练习实例
2017/09/28 jQuery
ES6的Fetch异步请求的实现方法
2018/12/07 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
在vue中利用v-html按分号将文本换行的例子
2019/11/14 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
Python中运行并行任务技巧
2015/02/26 Python
windows下安装Python和pip终极图文教程
2017/03/05 Python
解决Django模板无法使用perms变量问题的方法
2017/09/10 Python
Windows下python3.6.4安装教程
2018/07/31 Python
django DRF图片路径问题的解决方法
2018/09/10 Python
Python通过for循环理解迭代器和生成器实例详解
2019/02/16 Python
python3.6根据m3u8下载mp4视频
2019/06/17 Python
极简的HTML5模版
2015/07/09 HTML / CSS
html5自动播放mov格式视频的实例代码
2020/01/14 HTML / CSS
导游的职业规划书范文
2013/12/27 职场文书
单位实习证明怎么写
2014/01/17 职场文书
妈妈的账单教学反思
2014/02/06 职场文书
分公司经理任命书
2014/06/05 职场文书
电影开国大典观后感
2015/06/04 职场文书
悬崖上的金鱼姬观后感
2015/06/15 职场文书
疾病证明书
2015/06/19 职场文书
进阶篇之linux环境下安装MySQL数据库
2022/04/09 MySQL
公历12个月名称的由来
2022/04/12 杂记
科学家测试在太空中培育人造肉,用于未来太空旅行
2022/04/29 数码科技