php7高效生成二维码:composer和荷兰PHP开发者的QrCode

  • 时间:
  • 浏览:91
  • 来源:我要辅助网_提供我爱网技术_我爱收集网资讯

墨迹

php7早已于2015年12月发布,当前7.0分支因为进化到7.0.11版,而7.1分支也发布了RC3版,快一点 7.1将发布正式版。本博很多 介绍过在php生成二维码的phpqrcode你什儿 类库,原文见此:http://blog.jjonline.cn/phptech/110.html;但你什儿 类太老旧了,sourceforge代码托管平台上你什儿 类因为刚刚没更新过了,最新的版本还是2010年10月7日发布的,截止至今天刚好6年。

809年php发布5.3时首次引入了命名空间的概念,而phpqrcode发布最后另另有一兩个版本的2010年,那个完后 php的命名空间还不流行,以后难 在广泛范围内被接受。今天要介绍的php7下生成二维码的高效类QrCode是另另有一兩个由荷兰开发开发的二维码生成类,还也能用composer来管理,php7下当然还还也能使用phpqrcode。顺应时代才不不被淘汰,其实php高版本的命名空间语法我能 无比蛋疼。

php的类库管理工具:composer

你否有有你什儿 麻烦?另另有一兩个项目引入的各种sdk、开源类很多了,而每个开源类又有不同版本,管理起来相当麻烦,非要手工处置每另另有一兩个类的存放路径和文件引入。

composer很多 用于处置你什儿 麻烦的,使用简单的composer命令就还也能很便捷的安装和管理各种支持composer的开源类。composer是哪些地方?简单点来说很多 另另有一兩个用于管理php类的工具,使用composer管理和管理的类均自动按一定路径规则存储类文件并提供好php加载器供项目中调用。时下composer这样方便,各种框架、强大的开源类都逐一支持了composer安装和管理,比如:Yii、ThinkPHP,乃至大名鼎鼎的由PHP官方开发组开发的Zend Framework2框架也支持composer。

composer的具体介绍和使用不再墨迹,网上一大把,留下另另有一兩个:http://www.kancloud.cn/thinkphp/composer

QrCode的安装和使用

关于QrCode你什儿 类库没必要完整性介绍,基于php的GD库,用于生成任意尺寸的二维码,刚刚 还也能将logo水印也换成,还还也能在二维码图片下方加入文字。QrCode的项目地址:https://github.com/endroid/QrCode

在命令行下操作安装QrCode类:进入项目根目录或测试目录,执行composer安装命令,如下

cd /wwwRoot/Blog/wwwRoot/project/qrcode
composer require endroid/qrcode

安装完毕该目录下会自动生成vendor目录和composer.jsoncomposer.lock文件,截图如下:

其中font目录是我底下加入的字体文件放置目录,index.php是本次测试调用入口文件。composer安装完毕,QrCode的类文件就按照composer的规则自动存装入 vendor目录下了,打开vendor目录我能 发现有个autoload.php文件和几次文件夹,这几次文件存放的很多 各种类库文件了。vendor目录行态如下:

其中composer目录是composer你什儿 工具所实现的php自动加载器,endroid目录很多 本次QrCode的类库文件了,而symfony目录则是endroid依赖的另外另另有一兩个php类库,安装QrCode库时symfony会自动安装,不不手动处置依赖关系。而autoload.php文件则是composer自动为我们我们我们 处置好的php类加载器,我们我们我们 要调用由composer安装的某个类时,引用你什儿 文件即可,不不再去include一堆文件了,这很多 命名空间与文件存储路径按一定规则一一对应,并利用php的spl_autoload_register函数实现的自动加载机制实现各个类的自动加载功能,很多我们我们我们 要调用由composer安装的类时只非要引入autoload.php你什儿 加载器文件就还也能了。因为我们我们我们 此人 的项目都不 自动加载器很多言而喻影响,这很多 spl_autoload_register你什儿 函数的好处了,还也能指在多个加载器。

QrCode调用的代码示例:

本次示例很简单,并这样融入到已有项目中,很多新建另另有一兩个index.php直接调用就还也能了,代码中会有许多解释,代码如下:

<?php
/**
 * php7下生成二维码
 * `利用composer管理类`
 * @authors Jea杨 (JJonline@JJonline.Cn)
 * @date    2016-10-07 20:26:05
 * @version 1.0
 */
error_reporting(0);
//引入composer自动生成的类加载器
require_once 'vendor/autoload.php';
//命名空间法子调用QrCode类
use Endroid\QrCode\QrCode as EndroidQrCode;//将QrCode命名空间腾出来
 
//处置需生成二维码的内容、参数和文字
$data  = trim($_GET['data']) ? trim($_GET['data']) : 'http://blog.jjonline.cn/';
$size  = intval($_GET['size']) > 800 ? 800 : intval($_GET['size']);
$label = trim($_GET['label']) ? trim($_GET['label']) : null;
 
$QrModel = new EndroidQrCode();
##默认参数
$QrModel->setText($data) //设置二维码上的内容
        ->setPadding(5) //设置二维码内容距离图片边缘的便宜量,单位:像素px
        ->setErrorCorrection('high') //设置二维码的纠错率,还也能是low、medium、quartile、hign多个纠错率
        ->setForegroundColor(array('r' => 0, 'g' => 0, 'b' => 0, 'a' => 0)) //设置二维码的rgb颜色和透明度a,这里是黑色
        ->setBackgroundColor(array('r' => 255, 'g' => 255, 'b' => 255, 'a' => 0)) //设置二维码图片的背景底色,这里是白色
        ->setImageType(EndroidQrCode::IMAGE_TYPE_PNG);//设置输出的二维码图片格式,这里设置成png格式,还还也能是gif、jpeg、wbmp
###因为的指定生成的二维码尺寸,由get变量获取
$size ? $QrModel->setSize(intval($size)) : $QrModel->setSize(190);
###因为的指定二维码下方的文字,由get变量获取;写死15px的字体大小,方正静蕾简体手写体的字体
$label && $QrModel->setLabelFontPath('./font/yaya.ttf')->setLabel($label)->setLabelFontSize(15);
 
###设置输出的header头:输出的内容是一张图片
header('Content-Type: '.$QrModel->getContentType());
##QrCode类的输出png图片数据的法子输出图片,你什儿



完后

使用浏览器访问你什儿



Url将显示一张二维码图片
$QrModel->render();
 
###因为要换成logo水印,则在调用render法子完后

调用setLogo和setLogoSize法子
#这里就不调用了,写出示例
/**
 * $QrModel->setLogo('./logo.png');//设置logo水印图片的路径,相对路径和绝对路径均可,这里`./logo.png`表示使用与本文件平级的logo.png
 * $QrModel->setLogoSize(48);//设置logo水印的大小,参数是另另有一兩个int数字,单位px (注意:这里假设你的logo是另另有一兩个正方形)
 * 
 * header('Content-Type: '.$QrModel->getContentType());
 * $QrModel->render();
 */

1、设置二维码的内容法子:setText,参数为非要写入到二维码图像中的文本内容,还也能是任意文本,但非要超过二维码图像的信息容量

2、设置二维码尺寸的法子:setSize,参数为int型的数字,单位为像素px;注意实际图片大小还受到setPaddingsetLabelFontSize的影响

3、设置二维码距离边界的偏移量法子:setPadding,参数为int型的数字,单位为像素px

4、设置水印和水印尺寸的法子:setLogo法子指定水印图片的路径,也很多 该法子的参数是水印图片的路径,还也能是相对路径,也还也能是绝对路径,以及setLogoSize法子设置水印图片尺寸大小,参数为int型的数字,单位为像素px,默认值为48,你什儿 法子设置了水印图片在二维码图中的大小,刚刚 假设了你的logo是个正方形,很多要留意参数范围。

5、设置label和label字体大小以及字体的法子:setLabelFontPath法子指定生成label文字的字体文件位置,参数是字体文件的路径、setLabel设置指定label的内容、setLabelFontSize设置生成的label字体的大小,参数为int型的数字,单位为像素px

6、因为生成的二维码图片都不 输出到浏览器,非要保存到服务器中,使用save法子,参数是保存这张二维码图片的路径,相对路径和绝对路径均可

何为label?见上图,上图中晶晶的博客很多 label,上图为了便于说明,我换成了1px绿色的边框。

何为二维码距离边界的偏移量?上图黑色二维图像边缘并都不 靠近图片边界的,二维码图像距离图片边界的距离即为setPadding法子设置的偏移量,上图的setPadding值设置的5,也很多 5像素。

代码中已有完整性的注释和说明,就不再墨迹了,非要注意的是:composer非要php5.3.2以上的php环境,本次试验环境是php7.0.11,QrCode支持链式调用,很多写法上也能理解。

几次留意点

1、QrCode生成中文汉字的label的问題报告 :非要引入中文字体,很多非要调用setLabelFontPath法子传入另另有一兩个中文字体的路径,QrCode默认提供另另有有一兩个字体为opensans.ttf,在\vendor\endroid\qrcode\assets\font路径下,但QrCode类并未默认调用你什儿 字体,若不调用setLabelFontPath法子设置字体话语,生成中文的label会是小方框。另外非要使用UTF8编码的中文设置label

2、GD库编译参数的影响:当编译php时换成了–enable-gd-jis-conv参数话语,也很多 让php的GD库支持日文编码的字库;简单点来说:开启了你什儿 选项话语GD就会把TTF字库中大于127的要素(即不属于标准拉丁文字库的要素)按照日文JIS的顺序来映射,这样用来映射中文字体的完后 自然就变成乱码了。因为你的php开启了–enable-gd-jis-conv选项,设置中文label时纵使你传入的是utf8编码的也会跳出乱码错误,因为前述已解释。考虑到国内制作图片时非要支持鬼子文字的请况较少,建议编译php时去除–enable-gd-jis-conv选项。

3、若调用QrCode代码生成二维码跳出错误,请检查你的php版本,还有GD库编译参数:譬如否有支持png、jpeg、gif、wbmp等。

-----

最后将本文的示例装入 线上环境,url为:http://blog.jjonline.cn/project/qrcode/,我能 通过get变量data指定生成二维码的内容、size变量指定生成二维码的尺寸,最大800px,以及label指定生成的label内容,这类:

http://blog.jjonline.cn/project/qrcode/?data=http://blog.jjonline.cn/&size=80&label=%E6%99%B6%E6%99%B6%E7%9A%84%E5%8D%9A%E5%AE%A2

转载请注明出处 AE博客|墨渊 » php7高效生成二维码:composer和荷兰PHP开发者的QrCode