<?php
namespace app\api\controller;
use Grafika\Color;
use Grafika\Grafika;
class Poster
{
/**
* 生成海报
* @param $openid 推荐者用户id
* @param $qrcodeUrl 二位码将要跳转的链接
*/
public function create($openid='', $qrcodeUrl='')
{
// 背景
$backgroudImg = "./resource/background_default_567.png";
// 头像
$user = db('wx_user')->field('nickname,headimgurl')->where('openid', $openid)->find();
$headimgCir = './resource/headimg/'.$openid.'_c.jpg';
if (!file_exists($headimgCir)) {
$headimg = './resource/headimg/'.$openid.'.jpg';
if (!file_exists($headimg)) {
// 较快速保存用户头像
$ch = curl_init($user['headimgurl']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec($ch);
file_put_contents($headimg, $content);
}
// 切圆
$circleHeadimgObj = circle($headimg);
imagepng($circleHeadimgObj, $headimgCir);
}
$filename = date('Y_m_d_H_i_s',time()).mt_rand(111,999);
//二维码图片
$qrcodePath = "./resource/qrcode/".$filename.".png";
qrcode($qrcodeUrl, 8, $filename);
//生成图片
$editor = Grafika::createEditor();
$editor->open($bg, $backgroudImg); //背景图
$editor->open($qrcode, $qrcodePath); //二维码图片
$editor->open($head, $headimgCir); //头像
//设置图片大小
$editor->resizeFit($qrcode, 210, 210);
$editor->resizeFit($head, 98, 98);
//绑定二维码
$editor->blend($bg, $qrcode , 'normal', 0.9, 'bottom-right', -32, -21);
$editor->blend($bg, $head , 'normal', 0.9, 'top-left', 30,30);
// 默认地址不支持中文
// $font = Grafika::fontsDir() . DIRECTORY_SEPARATOR . 'MSYH.TTC';
$font = "/static/MSYH.TTF";
$editor->text($bg ,$user['nickname'], 22, 32, 800, new Color("#FE8A24"), $font);
$posterPath = "./resource/poster/".$filename.".png";
$editor->save($bg, $posterPath);
unlink($qrcodePath); //删除二维码
return $posterPath;
}
}
切圆方法在common.php中,如下
/**
* GD库将正方形图片切为圆形
* @param 图片相对路径
*/
function circle($imgpath='')
{
$ext = pathinfo($imgpath);
switch ($ext['extension']) {
case 'jpg':
$src_img = imagecreatefromjpeg($imgpath);
break;
case 'png':
$src_img = imagecreatefrompng($imgpath);
break;
default:
$src_img = null;
break;
}
$temp = getimagesize($imgpath);
$w = $temp[0];
$h = $temp[1];
$w = min($w, $h);
$h = $w;
$img = imagecreatetruecolor($w, $h);
imagesavealpha($img, true);
$bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
imagefill($img, 0, 0, $bg);
$r = $w / 2; // 半径
$y_x = $r; // 圆心X坐标
$y_y = $r; // 圆心Y坐标
for ($x=0; $x < $w; $x++) {
for ($y=0; $y < $h; $y++) {
$rgbColor = imagecolorat($src_img, $x, $y);
if (((($x - $r) * ($x - $r) + ($y - $r) * ($y - $r)) < ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
}
}
return $img;
}
生成二维码这里是用了phpqrcode,也在common.php中,这里不作生成二维码详解了
/**
* 生成二维码
* @param string $url url链接
* @param integer $size 尺寸 纯数字
* @param string $filename 要保存的文件名称
*/
function qrcode($url,$size=9,$filename){
include "../extend/phpqrcode/phpqrcode.php";
// 如果没有http 则添加
if (strpos($url, 'http')===false) {
$url='http://'.$url;
}
$filePath = "./resource/qrcode/".$filename.".png";
QRcode::png($url,$filePath,QR_ECLEVEL_L,$size,2,false,0xFFFFFF,0x000000);
}