You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
265 lines
11 KiB
265 lines
11 KiB
5 years ago
|
<?php
|
||
|
/**
|
||
|
* Created by PhpStorm.
|
||
|
* User: Administrator
|
||
|
* Date: 2017/8/12
|
||
|
* Time: 9:04
|
||
|
*/
|
||
|
|
||
|
namespace app\extensions;
|
||
|
|
||
|
/**
|
||
|
* @property \app\models\Qrcode $store_qrcode;
|
||
|
*/
|
||
|
class CreateQrcode
|
||
|
{
|
||
|
public $store_qrcode;//店铺推广海报设置
|
||
|
|
||
|
public $qrcode_bg;//海报背景图 750×1206
|
||
|
public $qrcode;//二维码 默认420×420
|
||
|
public $avatar;//头像
|
||
|
public $name;//昵称
|
||
|
|
||
|
public $avatar_w = 180;//头像宽
|
||
|
public $avatar_h = 180;//头像高
|
||
|
|
||
|
public $avatar_x = 30;//头像x坐标
|
||
|
public $avatar_y = 290;//头像y坐标
|
||
|
public $qrcode_w = 280;//二维码宽度
|
||
|
public $qrcode_x = 188;//二维码x坐标
|
||
|
public $qrcode_y = 526;//二维码y坐标
|
||
|
public $qrcode_true = 'true';//二维码y坐标
|
||
|
public $font_size = 36;//字体大小
|
||
|
public $font_color = ['r' => '0', 'g' => '0', 'b' => '0'];//字体大小
|
||
|
public $font_x = 364;//字体x坐标
|
||
|
public $font_y = 360;//字体y坐标
|
||
|
public $save_name;//字体y坐标
|
||
|
|
||
|
/**
|
||
|
* @return array
|
||
|
* 不处理成圆形
|
||
|
*/
|
||
|
public function ungetQrcode()
|
||
|
{
|
||
|
$store_qrcode = $this->store_qrcode;
|
||
|
//创建图片的实例
|
||
|
$qrcode_bg = imagecreatefromstring(file_get_contents($this->qrcode_bg));
|
||
|
$qrcode = imagecreatefromstring(file_get_contents($this->qrcode));
|
||
|
$avatar = imagecreatefromstring(file_get_contents($this->avatar));
|
||
|
|
||
|
//获取水印图片的宽高
|
||
|
list($qrcode_w, $qrcode_h,$qrcode_type) = getimagesize($this->qrcode);
|
||
|
list($avatar_w, $avatar_h,$avatar_type) = getimagesize($this->avatar);
|
||
|
list($qrcode_bg_w, $qrcode_bg_h) = getimagesize($store_qrcode->qrcode_bg);
|
||
|
|
||
|
//压缩图片
|
||
|
$new_width = $this->avatar_w;
|
||
|
$new_height = $this->avatar_h;
|
||
|
$image_thump = imagecreatetruecolor($new_width, $new_height);
|
||
|
//将原图复制带图片载体上面,并且按照一定比例压缩,极大的保持了清晰度
|
||
|
imagecopyresampled($image_thump, $avatar, 0, 0, 0, 0, $new_width, $new_height, $avatar_w, $avatar_h);
|
||
|
imagedestroy($avatar);
|
||
|
$avatar = $image_thump;
|
||
|
|
||
|
|
||
|
//将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果
|
||
|
imagecopymerge($qrcode_bg, $qrcode, $this->qrcode_x, $this->qrcode_y, 0, 0, $qrcode_w, $qrcode_h, 100);
|
||
|
imagecopymerge($qrcode_bg, $avatar, $this->avatar_x, $this->avatar_y, 0, 0, $new_width, $new_height, 100);
|
||
|
//如果水印图片本身带透明色,则使用imagecopy方法
|
||
|
//imagecopy($dst, $src, 10, 10, 0, 0, $src_w, $src_h);
|
||
|
|
||
|
$font = \Yii::$app->basePath . '/web/statics/font/AaBanSong.ttf';//字体
|
||
|
// $white = imagecolorallocate($qrcode_bg, 255, 255, 255);//字体颜色
|
||
|
// imagefttext($qrcode_bg, 36, 0, 254, 360, $white,$font, '我是:');
|
||
|
$purple = imagecolorallocate($qrcode_bg, $this->font_size['r'], $this->font_size['g'], $this->font_size['b']);//字体颜色
|
||
|
imagefttext($qrcode_bg, $this->font_size, 0, $this->font_x, $this->font_y, $purple, $font, $this->name);
|
||
|
// imagefttext($qrcode_bg, 36, 0, 254, 420, $white,$font, '代言真的有钱赚!');
|
||
|
// imagefttext($qrcode_bg, 32, 0, 284, 1000, $white,$font, '扫描二维码');
|
||
|
// imagefttext($qrcode_bg, 32, 0, 264, 1050, $white,$font, '和我一起赚钱!');
|
||
|
|
||
|
//输出图片
|
||
|
list($qrcode_bg_w, $qrcode_bg_h, $qrcode_bg_type) = getimagesize($qrcode_bg);
|
||
|
switch ($qrcode_bg_type) {
|
||
|
case 1://GIF
|
||
|
header('Content-Type: image/gif');
|
||
|
imagegif($qrcode_bg);
|
||
|
break;
|
||
|
case 2://JPG
|
||
|
header('Content-Type: image/jpeg');
|
||
|
imagejpeg($qrcode_bg);
|
||
|
break;
|
||
|
case 3://PNG
|
||
|
header('Content-Type: image/png');
|
||
|
imagepng($qrcode_bg);
|
||
|
break;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
$saveRoot = \Yii::$app->basePath . '/web/';
|
||
|
$saveDir = 'qrcode/';
|
||
|
if (!is_dir($saveRoot . $saveDir)) {
|
||
|
mkdir($saveRoot . $saveDir);
|
||
|
file_put_contents($saveRoot . $saveDir . '.gitignore', "*\r\n!.gitignore");
|
||
|
}
|
||
|
$webRoot = \Yii::$app->request->baseUrl . '/';
|
||
|
$saveName = md5(uniqid()) . '.jpg';
|
||
|
imagepng($qrcode_bg, $saveRoot . $saveDir . $saveName);
|
||
|
// file_put_contents($saveRoot.$saveDir.$saveName,$qrcode_bg);
|
||
|
imagedestroy($qrcode_bg);
|
||
|
imagedestroy($qrcode);
|
||
|
imagedestroy($avatar);
|
||
|
$qrcode = \Yii::$app->request->hostInfo . $webRoot . $saveDir . $saveName;
|
||
|
return [
|
||
|
'code' => 0,
|
||
|
'msg' => 'success',
|
||
|
'data' => $qrcode
|
||
|
];
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @todo : 本函数用于 将方形的图片压缩后
|
||
|
* 再裁减成圆形
|
||
|
* 与背景图合并
|
||
|
* @return
|
||
|
*/
|
||
|
public function getQrcode(){
|
||
|
//头像
|
||
|
$headimgurl = $this->avatar;
|
||
|
//二维码
|
||
|
$qrcode = $this->qrcode;
|
||
|
//背景图
|
||
|
$bgurl = $this->qrcode_bg;
|
||
|
$imgs['dst'] = $bgurl;
|
||
|
//保存到本地 图片临时存储路径
|
||
|
$saveRoot = \Yii::$app->basePath . '/web/temp/';
|
||
|
$saveDir = '';
|
||
|
if (!is_dir($saveRoot . $saveDir)) {
|
||
|
mkdir($saveRoot . $saveDir);
|
||
|
file_put_contents($saveRoot . $saveDir . '.gitignore', "*\r\n!.gitignore");
|
||
|
}
|
||
|
$webRoot = \Yii::$app->request->baseUrl . '/';
|
||
|
|
||
|
|
||
|
//第一步 压缩图片
|
||
|
$imggzip = $this->resize_img($headimgurl,$saveRoot.$saveDir,$this->avatar_w);
|
||
|
$qrcodezip = $this->resize_img($qrcode,$saveRoot.$saveDir,$this->qrcode_w);
|
||
|
//第二步 裁减成圆角图片
|
||
|
$imgs['src'] = $this->test($imggzip,$saveRoot.$saveDir,$this->avatar_w,$this->avatar_w);
|
||
|
$qrcode_info = getimagesize($qrcode);
|
||
|
$imgs['qrcode'] = $this->test($qrcodezip,$saveRoot.$saveDir,$this->qrcode_w,$this->qrcode_w,$this->qrcode_true);
|
||
|
//第三步 合并图片
|
||
|
$dest = $this->mergerImg($imgs,$saveRoot);
|
||
|
// return [
|
||
|
// 'code'=>0,
|
||
|
// 'msg'=>'success',
|
||
|
// 'data'=>\Yii::$app->request->hostInfo . $webRoot.'qrcode/'.$dest[1]
|
||
|
// ];
|
||
|
unlink($qrcode);
|
||
|
return $dest[1];
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param $url
|
||
|
* @param string $path
|
||
|
* @return string
|
||
|
* 压缩图片
|
||
|
*/
|
||
|
public function resize_img($url,$path='./',$old_width){
|
||
|
$imgname = $path.uniqid('r',true).'.jpg';
|
||
|
$file = $url;
|
||
|
list($width, $height) = getimagesize($file); //获取原图尺寸
|
||
|
$percent = ($old_width/$width);
|
||
|
//缩放尺寸
|
||
|
$newwidth = $width * $percent;
|
||
|
$newheight = $height * $percent;
|
||
|
$src_im = imagecreatefromjpeg($file);
|
||
|
$dst_im = imagecreatetruecolor($newwidth, $newheight);
|
||
|
imagecopyresized($dst_im, $src_im, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
|
||
|
imagejpeg($dst_im, $imgname); //输出压缩后的图片
|
||
|
imagedestroy($dst_im);
|
||
|
imagedestroy($src_im);
|
||
|
return $imgname;
|
||
|
}
|
||
|
//第一步生成圆角图片
|
||
|
public function test($url,$path='./',$w,$h,$is_true='true'){
|
||
|
// $w = 110; $h=110; // original size
|
||
|
$original_path= $url;
|
||
|
$dest_path = $path.uniqid('r',true).'.png';
|
||
|
$src = imagecreatefromstring(file_get_contents($original_path));
|
||
|
if($is_true == 'true'){
|
||
|
$newpic = imagecreatetruecolor($w,$h);
|
||
|
imagealphablending($newpic,false);
|
||
|
$transparent = imagecolorallocatealpha($newpic, 0, 0, 0, 127);
|
||
|
$r=$w/2;
|
||
|
for($x=0;$x<$w;$x++)
|
||
|
for($y=0;$y<$h;$y++){
|
||
|
$c = imagecolorat($src,$x,$y);
|
||
|
$_x = $x - $w/2;
|
||
|
$_y = $y - $h/2;
|
||
|
if((($_x*$_x) + ($_y*$_y)) < ($r*$r)){
|
||
|
imagesetpixel($newpic,$x,$y,$c);
|
||
|
}else{
|
||
|
imagesetpixel($newpic,$x,$y,$transparent);
|
||
|
}
|
||
|
}
|
||
|
imagesavealpha($newpic, true);
|
||
|
// header('Content-Type: image/png');
|
||
|
imagepng($newpic, $dest_path);
|
||
|
imagedestroy($newpic);
|
||
|
imagedestroy($src);
|
||
|
unlink($url);
|
||
|
}else{
|
||
|
imagesavealpha($src, true);
|
||
|
// header('Content-Type: image/png');
|
||
|
imagepng($src, $dest_path);
|
||
|
unlink($url);
|
||
|
}
|
||
|
return $dest_path;
|
||
|
}
|
||
|
//php 合并图片
|
||
|
public function mergerImg($imgs,$path='./') {
|
||
|
$name = $this->save_name;
|
||
|
$imgname = $path.$name;
|
||
|
list($max_width, $max_height,$qrcode_bg_type) = getimagesize($imgs['dst']);
|
||
|
$dests = imagecreatetruecolor($max_width, $max_height);
|
||
|
switch ($qrcode_bg_type) {
|
||
|
case 1://GIF
|
||
|
$dst_im = imagecreatefromgif($imgs['dst']);
|
||
|
break;
|
||
|
case 2://JPG
|
||
|
$dst_im = imagecreatefromjpeg($imgs['dst']);
|
||
|
break;
|
||
|
case 3://PNG
|
||
|
$dst_im = imagecreatefrompng($imgs['dst']);
|
||
|
break;
|
||
|
default:
|
||
|
$dst_im = imagecreatefromstring(file_get_contents($imgs['dst']));
|
||
|
break;
|
||
|
}
|
||
|
imagecopy($dests,$dst_im,0,0,0,0,$max_width,$max_height);
|
||
|
imagedestroy($dst_im);
|
||
|
$src_im = imagecreatefrompng($imgs['src']);
|
||
|
$src_info = getimagesize($imgs['src']);
|
||
|
$qrcode_im = imagecreatefrompng($imgs['qrcode']);
|
||
|
$qrcode_info = getimagesize($imgs['qrcode']);
|
||
|
imagecopy($dests,$src_im,$this->avatar_x,$this->avatar_y,0,0,$src_info[0],$src_info[1]);
|
||
|
imagedestroy($src_im);
|
||
|
imagecopy($dests,$qrcode_im,$this->qrcode_x,$this->qrcode_y,0,0,$qrcode_info[0],$qrcode_info[1]);
|
||
|
imagedestroy($qrcode_im);
|
||
|
|
||
|
|
||
|
$font = \Yii::$app->basePath . '/web/statics/font/AaBanSong.ttf';//字体
|
||
|
$purple = imagecolorallocate($dests, $this->font_color['r'], $this->font_color['g'], $this->font_color['b']);//字体颜色
|
||
|
imagefttext($dests, $this->font_size, 0, $this->font_x, $this->font_y, $purple, $font, $this->name);
|
||
|
//字体x,y坐标是字符串的左下角坐标
|
||
|
|
||
|
// var_dump($imgs);exit;
|
||
|
// header("Content-type: image/jpeg");
|
||
|
imagejpeg($dests,$imgname);
|
||
|
unlink($imgs['dst']);
|
||
|
unlink($imgs['src']);
|
||
|
unlink($imgs['qrcode']);
|
||
|
return [$dests,$name];
|
||
|
}
|
||
|
}
|