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中使用Oracle数据库(1)
Oct 09 PHP
不用数据库的多用户文件自由上传投票系统(3)
Oct 09 PHP
smarty实例教程
Nov 19 PHP
PHP通过header实现文本文件下载的代码
Aug 08 PHP
php 创建以UNIX时间戳命名的文件夹(示例代码)
Mar 08 PHP
用php来限制每个ip每天浏览页面数量的实现思路
Feb 24 PHP
php语言中使用json的技巧及json的实现代码详解
Oct 27 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
PHP socket 模拟POST 请求实例代码
Jul 18 PHP
thinkphp5.1框架容器与依赖注入实例分析
Jul 23 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
Nov 13 PHP
浅谈PHP中的那些魔术常量
Dec 02 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
ThinkPHP3.1新特性之对页面压缩输出的支持
2014/06/19 PHP
php写入数据到CSV文件的方法
2015/03/14 PHP
PHP设计模式之原型设计模式原理与用法分析
2018/04/25 PHP
效率高的Javscript字符串替换函数的benchmark
2008/08/02 Javascript
JavaScript 学习点滴记录
2009/04/24 Javascript
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
JS 进度条效果实现代码整理
2011/05/21 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
jQuery对下拉框,单选框,多选框的操作
2014/02/21 Javascript
延时加载JavaScript代码提高速度
2015/12/27 Javascript
bootstrap的3级菜单样式,支持母版页保留打开状态实现方法
2016/11/10 Javascript
Jquery循环截取字符串的方法(多出的字符串处理成&quot;...&quot;)
2016/11/28 Javascript
vue element-ui table表格滚动加载方法
2018/03/02 Javascript
如何自定义微信小程序tabbar上边框的颜色
2019/07/09 Javascript
js仿京东放大镜效果
2020/08/09 Javascript
python Django模板的使用方法(图文)
2013/11/04 Python
python检测lvs real server状态
2014/01/22 Python
Python中使用partial改变方法默认参数实例
2015/04/28 Python
Python实现感知器模型、两层神经网络
2017/12/19 Python
Python cookbook(数据结构与算法)将名称映射到序列元素中的方法
2018/03/22 Python
python 文件查找及内容匹配方法
2018/10/25 Python
Python字符串的常见操作实例小结
2019/04/08 Python
解决pycharm下os.system执行命令返回有中文乱码的问题
2019/07/07 Python
Python企业编码生成系统之系统主要函数设计详解
2019/07/26 Python
python打包成so文件过程解析
2019/09/28 Python
pytorch使用horovod多gpu训练的实现
2020/09/09 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
SIDESTEP荷兰:在线购买鞋子
2019/11/18 全球购物
俄罗斯设计师家具购物网站:The Furnish
2019/12/01 全球购物
2014年党员个人剖析材料
2014/10/08 职场文书
教师党的群众路线教育实践活动剖析材料
2014/10/09 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话
2014/10/21 职场文书
初二英语教学反思
2016/02/15 职场文书
解决golang 关于全局变量的坑
2021/05/06 Golang
win10双系统怎么删除一个系统?win10电脑有两个系统删除一个的操作方法
2022/07/15 数码科技