欢迎您, 来到 宁时修博客.^_^

thinkPHP之PHPQRcode动态生成二维码

2016/08/25 宁时修 php 2857
PHP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码。

PHP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码。

之所以会用phpqrcode,是因为公司项目需要,项目中有一个邀请好友送好礼的活动,在邀请好友方式中我们需要通过扫码二维码来分享指定的链接,而恰好邀请好友的链接不是唯一的,不能用第三方工具事先来生成二维码图片在放在网站上,必须得动态生成二维码图片,第一时间便想到了QRcode。PHP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码。


第一步:下载phpqrcode.php类扩展包

下载包地址:http://sourceforge.net/projects/phpqrcode/

注意:你的PHP环境必须开启支持GD2。

phpqrcode官方网站:http://phpqrcode.sourceforge.net/


第二步:下载之后,解压引入phpqrcode.php文件到自己的项目中

ps:我们只需要引入phpqrcode.php,这个文件就可以了。其他的文件不需要引入。


第三步:具体的案例操作

PHP端,基于Thinkphp 3.2.3

<?php
namespace Home\Controller;
use Think\Controller;
class CodeimgController extends Controller {

   /*使用说明:
   phpqrcode.php提供了一个关键的png()方法,其中
   只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2。
   参数$text表示生成二位的的信息文本;
   参数$outfile表示是否输出二维码图片 文件,默认否;
   参数$level表示容错率,也就是有被覆盖的区域还能识别,分别是 L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%);
   参数$size表示生成图片大小,默认是3;参数$margin表示二维码周围边框空白区域间距值;
   参数$saveandprint表示是否保存二维码并显示。
   */
   //生成简单的动态二维码
   public function show() {
     //引入 phpqrcode文件
     require_once APP_PATH . "Common/phpqrcode/phpqrcode.php";
     \QRcode::png('http://www.mgchen.com/a/15.html');//生成二维码图片
   }
   
   //应用最广的动态二维码 带有公司logo图片 不生产图片文件,方便调用的,将下面的代码保存为img.php
   //模板文件 调用方式 {:U('Home/Codeimg/index')} <img src="{:U('Home/Codeimg/index')}">
   public function index() {
     //引入 phpqrcode文件
     require_once APP_PATH . "Common/phpqrcode/phpqrcode.php";
     $value = 'http://www.mgchen.com/a/15.html'; //二维码内容
     $errorCorrectionLevel = 'L';//容错级别
     $matrixPointSize = 8;//生成图片大小
     $rootImg = "./Public/images/qrcode.png";//设置生成不带logo二维码图片路径名称(原始二维码图)
     \QRcode::png($value, $rootImg, $errorCorrectionLevel, $matrixPointSize, 2);//生成二维码图片
     $logo = './Public/images/header-color.png';//准备好的logo图片
     $QR = $rootImg;//已经生成的原始二维码图
     //重新生成带logo的二维码图片
     if ($logo !== FALSE) {
       $QR = imagecreatefromstring(file_get_contents($QR));
       $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 / 6;
       $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);
     }
     //输出图片
     header("Content-type: image/png");
     //删除 不带logo二维码图片(原始二维码图) 如果需要保存图片可以 注释该行代码
     unlink($rootImg);
     //输出图片到浏览器
     imagepng($QR);
 }
 
 //简单使用
 public function showImg(){
   $this->display();
 }
}

上述的案例是我早期写得,现在基本上已经不用这种方式引入了。自从composer横空出世之后,这种原始的require引包加载的方式已经不适合当今得php编程了。

=========================分割线=========================

简单的阐述下在tp3中如何使用composer来自动加载Qrcode依赖包。

  1. 在tp3中是不会自动加载composer的,需要在入口文件中手动操作一下

  2. // 加载composer
    require './vendor/autoload.php';
    // 引入ThinkPHP入口文件
    require './ThinkPHP/ThinkPHP.php';
  3. 安装qrcode扩展依赖包

  4. // 根据你的php版本来加载依赖包。以php5.6为列
    // v 3.0.X支持版本是php 7.^ v2.0.x支持版本是php 5.6  v1.0.x支持版本是php 5.4
    composer require endroid/qrcode:2.5.1 #安装指定版本
  5. 使用案例

  6. use Endroid\QrCode\ErrorCorrectionLevel;
    use Endroid\QrCode\LabelAlignment;
    use Endroid\QrCode\QrCode;
    use Symfony\Component\HttpFoundation\Response;
    // 创建QRcode
    $qrCode = new QrCode('Life is too short to be generating QR codes');
    $qrCode->setSize(300);
    // 设置高级选项
    $qrCode
        ->setWriterByName('png')
        ->setMargin(10)
        ->setEncoding('UTF-8')
        ->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH)
        ->setForegroundColor(['r' => 0, 'g' => 0, 'b' => 0])
        ->setBackgroundColor(['r' => 255, 'g' => 255, 'b' => 255])
        ->setLabel('Scan the code', 16, __DIR__.'/../assets/noto_sans.otf', LabelAlignment::CENTER)
        ->setLogoPath(__DIR__.'/../assets/symfony.png')
        ->setLogoWidth(150)
        ->setValidateResult(false)
    ;
    // 直接输出QR码
    header('Content-Type: '.$qrCode->getContentType());
    echo $qrCode->writeString();
    // 将其保存到文件中
    $qrCode->writeFile(__DIR__.'/qrcode.png');
    // 创建响应对象
    $response = new Response($qrCode->writeString(), Response::HTTP_OK, ['Content-Type' => $qrCode->getContentType()]);
  7. 详细文档说明:https://github.com/endroid/qr-code/tree/2.5.1
点赞
说说你的看法

所有评论: (0)

# 加入组织

1、用手机QQ扫左侧二维码

2、搜Q群:1058582137

3、点击 宁时修博客交流群