Browse Source

Add 背景和Logo可以通过外部传资源的方式使用

Zhu Jinhui 7 years ago
parent
commit
956cc743be
2 changed files with 107 additions and 38 deletions
  1. 45 1
      src/Library/Qr.php
  2. 62 37
      src/Library/QrCode/Traits/Fill.php

+ 45 - 1
src/Library/Qr.php

@@ -2,6 +2,40 @@
 /**
  * 二维码工具
  * 提供读取和生成二维码方法
+ * 使用如下:
+ * 
+ *		$option = array(
+ *            'width' => 240, //图片大小
+ *            'margin' => 4,
+ *            'logo' => 'static/images/logo.png', //logo
+ *			'logRes' => $logRes,
+ *            //'bg' => 'static/images/bnr1.jpg',
+ *			'bgRes' => $bgRes,
+ *            'pointColor' => '#000000', //定点颜色
+ *            'inPointColor' => '#000000',//内定点
+ *            'frontColor' => '#000000',//前景色
+ *            'bgColor' => '#DCDCDC', //背景色
+ *            'contentColor' => '#000000', //内容颜色
+ *            'style' => 2,//直角 1, 液态 2 ,圆角 0
+ *        );
+ *		$option = array(
+ *            'width' => 240, //图片大小
+ *            'margin' => 4,
+ *            'logo' => 'static/images/logo.png', //logo
+ *            //'bg' => 'static/images/bnr1.jpg',
+ *            'fontSize' => 12,
+ *            'fontPath' => '../private/tools/fonts/SourceHanSerifSC-ExtraLight.otf',
+ *           'frontColor' => '#003300',//前景色
+ *            'bgColor' => '#FFFFFF', //背景色
+ *			'text' => 'travelzs.com',
+ *            'style' => 2,//直角 1, 液态 2 ,圆角 0
+ *        );
+ *        $qrCls = new \Qii\Library\Qr();
+ *		$txt = $this->request->url->get('txt', 'http://www.travelzs.com');
+ *		$pointSize = $this->request->url->get('pointSize', 8);
+ *		$style = $this->request->url->get('style', 1);
+ *		$option['style'] = $style;
+ *        $qrCls->creatorColor($txt, $pointSize, 4, 4, $option);
  */
 
 namespace Qii\Library;
@@ -78,7 +112,9 @@ class Qr
             'width' => 240, //图片大小
             'margin' => 2,
             'logo' => '', //logo
-            'bg' => '',
+			'logoRes' => null,
+            'bg' => '',//背景图
+			'bgRes' => null,//背景图资源
             'fontSize' => 14,
             'fontPath' => __DIR__ . DS . 'ttfs'. DS . 'msyh.ttc',
             'fontColor' => '#000000',
@@ -119,11 +155,19 @@ class Qr
         if (!empty($options['logo'])) {
             $im = $this->imageAddLogo($im, $options['logo']);
         }
+		if(!empty($options['logoRes'])) {
+			$im = $this->imageAddLogoRes($im, $options['logoRes']);
+		}
+		
 
         //添加背景图
         if (!empty($options['bg'])) {
             $im = $this->imageAddBG($im, $options['bg']);
         }
+		
+		if(!empty($options['bgRes'])) {
+			$im = $this->imageAddBGRes($im, $options['bgRes']);
+		}
 
         if(!empty($options['text']))
         {

+ 62 - 37
src/Library/QrCode/Traits/Fill.php

@@ -62,7 +62,9 @@ trait Fill
         }
     }
 
-    //圆角
+    /**
+	 * 图片圆角
+	 */
     public function roundedCorner($img, $x, $y, $s, $color, $lt = true, $lb = true, $rb = true, $rt = true)
     {
         if ($lt) {
@@ -124,66 +126,88 @@ trait Fill
     }
 
     //增加背景
-    public function imageAddBG($im, $bgpath)
+    public function imageAddBG($im, $bgPath)
     {
-
-        //计算宽和高
-        $w = imagesx($im);
-        $h = imagesy($im);
-
         //加载logo
-        $ext = substr($bgpath, strrpos($bgpath, '.'));
+        $ext = pathinfo($bgPath, PATHINFO_EXTENSION);
         if (empty($ext)) {
             return false;
         }
         switch (strtolower($ext)) {
-            case '.jpg':
-                $srcIm = @imagecreatefromjpeg($bgpath);
+            case 'jpg':
+                $bgRes = @imagecreatefromjpeg($bgPath);
                 break;
-            case '.gif':
-                $srcIm = @imagecreatefromgif($bgpath);
+            case 'gif':
+                $bgRes = @imagecreatefromgif($bgPath);
                 break;
-            case '.png':
-                $srcIm = @imagecreatefrompng($bgpath);
+            case 'png':
+                $bgRes = @imagecreatefrompng($bgPath);
                 break;
 
         }
-
-        $bgw = imagesx($srcIm);
-        $bgh = imagesy($srcIm);
-        imagecopymerge($srcIm, $im, ($bgw / 2) - ($w / 2), ($bgh / 2) - ($h / 2), 0, 0, $w, $h, 100);
-        imagedestroy($im);
-        return $srcIm;
+		
+		return $this->imageAddBGRes($im, $bgRes);
     }
-
-    //图片增加logo
-    public function imageAddLogo($im, $logo)
-    {
+	/**
+	 * 添加背景,参数都是资源
+	 * @param resource $im 图片资源
+	 * @param resource $bgRes 背景图片
+	 * @return resource
+	 */
+	public function imageAddBGRes($im, $bgRes)
+	{
         //计算宽和高
         $w = imagesx($im);
         $h = imagesy($im);
+        $bgw = imagesx($bgRes);
+        $bgh = imagesy($bgRes);
+        imagecopymerge($bgRes, $im, ($bgw / 2) - ($w / 2), ($bgh / 2) - ($h / 2), 0, 0, $w, $h, 100);
+        imagedestroy($im);
+        return $bgRes;
+	}
 
+    /**
+	 * 图片增加logo
+	 * @param resource $im 图片资源
+	 * @param resource $logo logo图
+	 * @return resource
+	 */
+    public function imageAddLogo($im, $logo) {
         //加载logo
         $ext = pathinfo($logo, PATHINFO_EXTENSION);
 
         if (empty($ext)) {
-            return false;
+            throw new \Exception('Unsupported image format');
         }
         switch (strtolower($ext)) {
             case 'jpg':
-                $srcIm = @imagecreatefromjpeg($logo);
+                $logoRes = @imagecreatefromjpeg($logo);
                 break;
             case 'gif':
-                $srcIm = @imagecreatefromgif($logo);
+                $logoRes = @imagecreatefromgif($logo);
                 break;
             case 'png':
-                $srcIm = @imagecreatefrompng($logo);
+                $logoRes = @imagecreatefrompng($logo);
                 break;
-
+			default:
+				throw new \Exception('Unsupported image format');
+				break;
         }
-        $srcIm = $this->resizeImage($srcIm, min(36, $w / 5), min(36, $h / 5));
-        $srcWidth = imagesx($srcIm);
-        $srcHeight = imagesy($srcIm);
+		return $this->imageAddLogoRes($im, $logoRes);
+    }
+	/**
+	 * 通过图片资源生成
+	 * @param resource $im 图片资源
+	 * @param resource $logoRes Logo资源
+	 * @return resource
+	 */
+	public function imageAddLogoRes($im, $logoRes) {
+        //计算宽和高
+        $w = imagesx($im);
+        $h = imagesy($im);
+        $logoRes = $this->resizeImage($logoRes, min(36, $w / 5), min(36, $h / 5));
+        $srcWidth = imagesx($logoRes);
+        $srcHeight = imagesy($logoRes);
 
 
         //logo边框1 小
@@ -223,11 +247,11 @@ trait Fill
         imagedestroy($bor1);
 
         //二维码与logo合并
-        $srcIm = $rounder->round_it($srcIm);
-        imagecopymerge($im, $srcIm, ($w / 2) - ($srcWidth / 2), ($h / 2) - ($srcHeight / 2), 0, 0, $srcWidth, $srcHeight, 100);
-        imagedestroy($srcIm);
+        $logoRes = $rounder->round_it($logoRes);
+        imagecopymerge($im, $logoRes, ($w / 2) - ($srcWidth / 2), ($h / 2) - ($srcHeight / 2), 0, 0, $srcWidth, $srcHeight, 100);
+        imagedestroy($logoRes);
         return $im;
-    }
+	}
 
     /**
      * 在二维码下边生成图片
@@ -340,7 +364,8 @@ trait Fill
 
     /**
      * 16进制颜色转换为RGB色值
-     * @method hex2rgb
+     * @param string $hexColor 颜色值
+	 * @return array {r:, g:, b:}
      */
     public function hex2rgb($hexColor)
     {