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

  • 时间:
  • 浏览:12
  • 来源:众神智能 - 专注共享阿楠教学网分享

墨迹

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年。

4009年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']) > 4000 ? 4000 : 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变量指定生成二维码的尺寸,最大4000px,以及label指定生成的label内容,例如:

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

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