icewing

使用phpqrcode生成网页的二维码
看到了QRCode,于是来试一试。通过简单的调用phpqrcode实现二维码的生成功能。
扫描右侧二维码阅读全文
03
2018/12

使用phpqrcode生成网页的二维码

看到了QRCode,于是来试一试。通过简单的调用phpqrcode实现二维码的生成功能。

本地环境

为了方便没有在服务器上操作,直接用了本地的PHP环境。如下。

Apache/2.4.29 

OpenSSL/1.1.0g 

PHP/7.2.3 

Server at 127.0.0.1 

Port 8088

准备

下载phpqrcode

http://labfile.oss.aliyuncs.com/courses/991/phpqrcode.zip

解压。将phpqrcode文件夹放到本地网站目录中。


开始

phpqrcode

这里先查看一下需要用到QrCode类的png方法。

打开phpqrcode.php,找到3091行。

    public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) 
    {
        $enc = QRencode::factory($level, $size, $margin);
        return $enc->encodePNG($text, $outfile, $saveandprint=false);
    }

1

函数详细说明

参数含义
text生成二维码的网站地址
outfile不生成图片文件,默认为false
level控制二维码的容错率,默认为L,范围:LMQH
size生成图片的大小,默认为4,范围:1-10
margin生成二维码的空白区域大小
saveandprint保存二维码图片并显示出来,$outfile必须传递图片路径

建立test1.php

phpqrcode文件夹同级目录中建立test1.php,输入下面的代码。

<?php
include "./phpqrcode/phpqrcode.php";
  $url="https://bingyishow.top";
  $path = false;
  $level = "L";
  $size = 10;
  $margin = 2;
  $qrcode = new Qrcode();
  $qrcode->png($url, $path, $level, $size, $margin);
?>

各个参数的含义可以参照上方的表格,之后游览器中输入 http://127.0.0.1:8088/test1.php 。就会生成如下这个二维码了。扫一扫就可以查看我的博客了。

2


扩展

但是仅仅一个二维码还是有些单调。尝试一下添加其他功能。

保存图片并输出图片

同样目录下建立一个test2.php ,并输入如下代码。

<?php
include "./phpqrcode/phpqrcode.php";
    $url="https://bingyishow.top";
    $path = 'bingyishow.png';
    $level = "L";
    $size = 10;
    $margin = 2;
    $qrcode = new Qrcode();
    $qrcode->png($url, $path, $level, $size, $margin);

    //保存二维码,并输出显示
    $QR = imagecreatefromstring(file_get_contents($path));
    imagepng($QR, 'bingyishow.png');
    imagedestroy($QR);
    echo '<img src="bingyishow.png" alt="请扫码">';
?>

然后运行,可以看到如下图的结果。成功生成了图片。

3

二维码添加logo

再建立一个test3.php。然后输入如下代码。

<?php
include "./phpqrcode/phpqrcode.php";
  $url="https://bingyishow.top";
  $path = 'bingyishow_logo.png';
  $level = "L";
  $size = 10;
  $margin = 2;
  $qrcode = new Qrcode();
  $qrcode->png($url, $path, $level, $size, $margin);

  $logo = 'touxiang4.jpg'; // 中间的logo图片
  $QR = $path;
  if(file_exists(@$logo) && $path !== false){
    // 从字符串中的图像流新建图像
    $QR = imagecreatefromstring(file_get_contents($QR));
    $logo = imagecreatefromstring(file_get_contents($logo));

    // 获取 QR 的宽高
    $QR_width = imagesx($QR);
    $QR_height = imagesy($QR);

    // 获取 logo 的宽高
    $logo_width = imagesx($logo);
    $logo_height = imagesy($logo);

    //获取二维码上的 logo 宽
    $logo_qr_width = $QR_width / 5;

    // 获取缩小比例
    $scale = $logo_width / $logo_qr_width;

    //获取等比例二维码上的 logo 高
    $logo_qr_height = $logo_height / $scale;

    // 获取 logo 在二维码上的开始的坐标点
    $start_xy = ($QR_width - $logo_qr_width) / 2;

    // 把 logo 拷贝到 QR 上
    imagecopyresampled($QR, $logo, $start_xy, $start_xy, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
    $last = 'logo_'.$path;

    //保存带 logo 的二维码
    imagepng($QR, $last);
    imagedestroy($QR);
    imagedestroy($logo);

  }
  //如果存在logo就显示带logo的二维码,否则就显示原始二维码
  if(file_exists(@$last)){
    echo "<img src='$last' alt='请扫码'>";
  }else{
    echo "<img src='$path' alt='请扫码'>";
  }
?>

这里我随意从博客中取了一个图片,效果如下图所示。分别生成了带有logo和不带有logo的图片。

4

其中关于 imagecopyresampled 的参数: bool imagecopyresampled ( resource dst_image , resourcedstimage,resourcesrc_image , int dst_x , intdstx,intdst_y , int src_x , intsrcx,intsrc_y , int dst_w , intdstw,intdst_h , int src_w , intsrcw,intsrc_h )

参数含义
dst_image新建的图片
src_image需要载入的图片
dst_x设定需要载入的图片在新图中的x坐标
dst_y设定需要载入的图片在新图中的y坐标,x,y同为 0 则从左上角开始
src_x设定载入图片要载入的区域x坐标
src_y设定载入图片要载入的区域y坐标,x,y同为 0 则从左上角开始
dst_w设定载入的原图的宽度(在此设置缩放)
dst_h设定载入的原图的高度(在此设置缩放)
src_w原图要载入的宽度
src_h原图要载入的高度
  • 目前就到这里了。如果尝试了其他有趣的玩法再更新吧。
最后修改:2018 年 12 月 03 日 05 : 20 PM
生活需要一些仪式感,比如手冲一杯咖啡:)

发表评论