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 日期时间处理函数小结
Dec 18 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
ThinkPHP3.1新特性之G方法的使用
Jun 19 PHP
jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码
Oct 15 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
PHP中异常处理的一些方法整理
Jul 03 PHP
win7系统配置php+Apache+mysql环境的方法
Aug 21 PHP
PHP常见数组函数用法小结
Mar 21 PHP
PHP编程实现多维数组按照某个键值排序的方法小结【2种方法】
Apr 27 PHP
PHP PDOStatement::getColumnMeta讲解
Feb 01 PHP
redis+php实现微博(一)注册与登录功能详解
Sep 23 PHP
PHP正则之正向预查与反向预查讲解与实例
Apr 06 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
PHP5中Cookie与 Session使用详解
2013/04/30 PHP
php的慢速日志引起的Mysql错误问题分析
2014/05/13 PHP
php同时使用session和cookie来保存用户登录信息的实现代码
2016/05/13 PHP
CodeIgniter生成静态页的方法
2016/05/17 PHP
Thinkphp5+plupload实现的图片上传功能示例【支持实时预览】
2019/05/08 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
关于js获取radio和select的属性并控制的代码
2011/05/12 Javascript
高效的获取当前元素是父元素的第几个子元素
2013/10/15 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
jquery.validate提示错误信息位置方法
2016/01/22 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
javascript下使用Promise封装FileReader
2016/02/19 Javascript
js改变透明度实现轮播图的算法
2020/08/24 Javascript
Angular2生命周期钩子函数的详细介绍
2017/07/10 Javascript
bootstrap table方法之expandRow-collapseRow展开或关闭当前行数据
2020/08/09 Javascript
微信小程序实现横向增长表格的方法
2018/07/24 Javascript
详解nodejs 配置文件处理方案
2019/01/02 NodeJs
Vue自定义指令上报Google Analytics事件统计的方法
2019/02/25 Javascript
javascript function(函数类型)使用与注意事项小结
2019/06/10 Javascript
过滤器vue.filters的使用方法实现
2019/09/18 Javascript
[42:50]NB vs VP 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
用Python抢过年的火车票附源码
2015/12/07 Python
Python多线程扫描端口代码示例
2018/02/09 Python
python hbase读取数据发送kafka的方法
2018/12/27 Python
Python使用正则表达式分割字符串的实现方法
2019/07/16 Python
Python小程序之在图片上加入数字的代码
2019/11/26 Python
Python 获取命令行参数内容及参数个数的实例
2019/12/20 Python
Window版下在Jupyter中编写TensorFlow的环境搭建
2020/04/10 Python
Selenium元素定位的30种方式(史上最全)
2020/05/11 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
2020/05/27 Python
HTML5 新事件 小结
2009/07/16 HTML / CSS
HTML5本地存储之Web Storage详解
2016/07/04 HTML / CSS
Vrbo西班牙:预订您的度假公寓(公寓、乡村房屋…)
2020/04/27 全球购物
医学生职业生涯规划书范文
2014/03/13 职场文书
开工仪式策划方案
2014/05/23 职场文书
违反交通安全法检讨书
2014/10/24 职场文书