PHP生成推广海报的方法分享


Posted in PHP onApril 22, 2018

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

仔细分析一下,推广海报必要的要素就是海报背景图和二维码,这两者都容易生成,但要两者结合到一起组合成为一张图二维还要可以保存到本地便于分享出去,这就是难点了,在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);
}
}

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

//2. 在生成的二维码中加上logo(生成图片文件) 
function scerweima1($url=''){ 
require_once 'phpqrcode.php'; 
$value = $url; //二维码内容 
$errorCorrectionLevel = 'H'; //容错级别 
$matrixPointSize = 6; //生成图片大小 
//生成二维码图片 
$filename = 'qrcode/'.microtime().'.png'; 
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2); 
$logo = 'qrcode/logo.jpg'; //准备好的logo图片 
$QR = $filename; //已经生成的原始二维码图 
if (file_exists($logo)) { 
$QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。 
$logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。 
$QR_width = imagesx($QR); //二维码图片宽度 
$QR_height = imagesy($QR); //二维码图片高度 
$logo_width = imagesx($logo); //logo图片宽度 
$logo_height = imagesy($logo); //logo图片高度 
$logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5) 
$scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度) 
$logo_qr_height = $logo_height/$scale; //组合之后logo的高度 
$from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点 
//重新组合图片并调整大小 
/*

imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中 
*/ 
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height); 
} 
//输出图片 
imagepng($QR, 'qrcode.png'); 
imagedestroy($QR); 
imagedestroy($logo); 
return '<img src="qrcode.png" alt="使用微信扫描支付">'; 
} 
//调用查看结果 
echo scerweima1('https://www.baidu.com');

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

$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中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
PHP下几种删除目录的方法总结
Aug 19 PHP
附件名前加网站名
Mar 23 PHP
Zend Studio for Eclipse的java.lang.NullPointerException错误的解决方法
Dec 06 PHP
理解PHP中的stdClass类
Apr 18 PHP
php中curl使用指南
Feb 05 PHP
php获取json数据所有的节点路径
May 17 PHP
php用正则判断是否为数字的方法
Mar 25 PHP
PHP实现登陆并抓取微信列表中最新一组微信消息的方法
Jul 10 PHP
Ajax+PHP实现的删除数据功能示例
Feb 12 PHP
PHP filesize函数用法浅析
Feb 15 PHP
JS中彻底删除JSON对象组成的数组中的元素
Sep 22 PHP
PHP排序算法之归并排序(Merging Sort)实例详解
Apr 21 #PHP
PHP排序算法之快速排序(Quick Sort)及其优化算法详解
Apr 21 #PHP
Laravel模型间关系设置分表的方法示例
Apr 21 #PHP
PHP排序算法之基数排序(Radix Sort)实例详解
Apr 21 #PHP
PHP排序算法之堆排序(Heap Sort)实例详解
Apr 21 #PHP
PHP实现Huffman编码/解码的示例代码
Apr 20 #PHP
PHP排序算法之希尔排序(Shell Sort)实例分析
Apr 20 #PHP
You might like
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
浅析PHP substr,mb_substr以及mb_strcut的区别和用法
2013/06/21 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
php实现用于删除整个目录的递归函数
2015/03/16 PHP
php socket通信简单实现
2016/11/18 PHP
JS URL传中文参数引发的乱码问题
2009/09/02 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
点击A元素触发B元素的事件在IE8下会识别成A元素
2014/09/04 Javascript
javascript实现类似于新浪微博搜索框弹出效果的方法
2015/07/27 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
如何实现JavaScript动态加载CSS和JS文件
2020/12/28 Javascript
jQuery基本过滤选择器用法示例
2016/09/09 Javascript
Node.js中使用mongoose操作mongodb数据库的方法
2017/09/12 Javascript
elementui的默认样式修改方法
2018/02/23 Javascript
JS/HTML5游戏常用算法之路径搜索算法 A*寻路算法完整实例
2018/12/14 Javascript
jQuery实现的鼠标拖动画矩形框示例【可兼容IE8】
2019/05/17 jQuery
vue打开新窗口并实现传参的图文实例
2021/03/04 Vue.js
Python和Ruby中each循环引用变量问题(一个隐秘BUG?)
2014/06/04 Python
解决python删除文件的权限错误问题
2018/04/24 Python
tensorflow 获取模型所有参数总和数量的方法
2018/06/14 Python
不到20行代码用Python做一个智能聊天机器人
2019/04/19 Python
详解css3中的伪类before和after常见用法
2020/11/17 HTML / CSS
优秀员工自荐书
2013/12/19 职场文书
马云的职业生涯规划之路
2014/01/01 职场文书
学生励志演讲稿
2014/01/06 职场文书
竞职演讲稿范文
2014/01/11 职场文书
2015年党员承诺书
2015/01/21 职场文书
大学生社会实践感想
2015/08/11 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
导游词之广西漓江
2019/11/02 职场文书
MySQL kill不掉线程的原因
2021/05/07 MySQL
教你修复 Win11应用商店加载空白问题
2021/12/06 数码科技
win11无线投屏在哪设置? win11无线投屏功能的使用方法
2022/04/08 数码科技
MySql数据库 查询时间序列间隔
2022/05/11 MySQL
SqlServer常用函数及时间处理小结
2023/05/08 SQL Server