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

<?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];
}
}