suyuan/vendor/dh2y/think-qrcode/src/QRcode.php

227 lines
6.1 KiB
PHP
Raw Normal View History

<?php
/**
* Created by dh2y.
* Date: 2018/8/8 14:38
* for: 二维码生成
*/
namespace dh2y\qrcode;
use think\Exception;
use think\facade\Config;
use think\facade\Request;
class QRcode
{
protected $config = []; //相关配置
protected $cache_dir = ''; //二维码缓存
protected $outfile = ''; //输出二维码文件
protected $error = ''; //错误信息
public function __construct(){
$this->config= Config::get('qrcode.');
if(isset($this->config['cache_dir'])&&$this->config['cache_dir']!=''){
$this->cache_dir = $this->config['cache_dir'];
}else{
$this->cache_dir = 'uploads/qrcode';
}
if (!file_exists($this->cache_dir)){
mkdir ($this->cache_dir,0775,true);
}
require("phpqrcode/qrlib.php");
}
/**
* 生成普通二维码
* @param string $url 生成url地址
* @param bool $outfile
* @param int $size
* @param string $evel
* @return $this
*/
public function png($url,$outfile=false,$size=5,$evel='H'){
if(!$outfile){
$outfile = $this->cache_dir.'/'.time().'.png';
}
$this->outfile = $outfile;
\QRcode::png($url,$outfile,$evel,$size,2);
return $this;
}
/**
* 显示二维码
*/
public function show(){
$url = Request::instance()->domain().'/'.$this->outfile;
exit('<img src="'.$url.'"/>');
}
/**
* 返回url路径
* @return string
*/
public function entry(){
return Request::instance()->domain().'/'.$this->outfile;
}
/**
* 返回生成二维码的相对路径
* @param bool $ds
* @return string
*/
public function getPath($ds=true){
if($ds){
return '/'.$this->outfile;
}else{
return $this->outfile;
}
}
/**
* 销毁内容
*/
public function destroy(){
@unlink($this->outfile);
}
/**
* 添加logo到二维码中
* @param $logo
* @return bool|mixed
*/
public function logo($logo){
if (!isset($logo)||$logo=='') {
$this->error = 'logo不存在';
return false;
}
$QR = imagecreatefromstring(file_get_contents($this->outfile));
$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 / 5;
$scale = $logo_width/$logo_qr_width;
$logo_qr_height = $logo_height/$scale;
$from_width = ($QR_width - $logo_qr_width) / 2;
//重新组合图片并调整大小
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
$this->outfile = $this->cache_dir.'/'.time().'.png';
imagepng($QR, $this->outfile);
imagedestroy($QR);
return $this;
}
/**
* 添加背景图
* @param int $x 二维码在背景图X轴未知
* @param int $y 二维码在背景图Y轴未知
* @param string $dst_path
* @return $this
*/
public function background($x=200,$y=500,$dst_path = ''){
if($dst_path==''){
$dst_path = $this->config['background'];
}
$src_path = $this->outfile;//覆盖图
//创建图片的实例
$dst = imagecreatefromstring(file_get_contents($dst_path));
$src = imagecreatefromstring(file_get_contents($src_path));
//获取覆盖图图片的宽高
list($src_w, $src_h) = getimagesize($src_path);
//将覆盖图复制到目标图片上最后个参数100是设置透明度100是不透明这里实现不透明效果
imagecopymerge($dst, $src, $x, $y, 0, 0, $src_w, $src_h, 100);
$this->outfile = $this->cache_dir.'/'.time().'.png';
imagepng($dst, $this->outfile);//根据需要生成相应的图片
imagedestroy($dst);
return $this;
}
public function text($text,$size,$locate =[],$color = '#00000000',$font='simsun.ttc', $offset = 0, $angle = 0) {
$dst_path = $this->outfile;
//创建图片的实例
$dst = imagecreatefromstring(file_get_contents($dst_path));
/* 设置颜色 */
if (is_string($color) && 0 === strpos($color, '#')) {
$color = str_split(substr($color, 1), 2);
$color = array_map('hexdec', $color);
if (empty($color[3]) || $color[3] > 127) {
$color[3] = 0;
}
} elseif (!is_array($color)) {
throw new Exception('错误的颜色值');
}
//如果字体不存在 用composer项目自己的字体
if(!is_file($font)){
$font = dirname(__FILE__).'/'.$font;
}
//获取文字信息
$info = imagettfbbox($size, $angle, $font, $text);
$minx = min($info[0], $info[2], $info[4], $info[6]);
$maxx = max($info[0], $info[2], $info[4], $info[6]);
$miny = min($info[1], $info[3], $info[5], $info[7]);
$maxy = max($info[1], $info[3], $info[5], $info[7]);
/* 计算文字初始坐标和尺寸 */
$x = $minx;
$y = abs($miny);
$w = $maxx - $minx;
$h = $maxy - $miny;
//背景图信息
list($dst_w, $dst_h) = getimagesize($dst_path);
if (is_array($locate)) {
list($posx, $posy) = $locate;
$x += ($posx=='center')?(($dst_w - $w) / 2):$posx;
$y += ($posy=='center')?(($dst_h - $h) / 2):$posy;
} else {
throw new Exception('不支持的文字位置类型');
}
//字体颜色
$black = imagecolorallocate($dst, $color[0], $color[1], $color[2]);
//加入文字
imagefttext($dst, $size, $angle, $x, $y, $black,$font, $text);
//生成图片
$this->outfile = $this->cache_dir.'/'.time().'.png';
imagepng($dst, $this->outfile);
imagedestroy($dst);
return $this;
}
}