下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
1. 生成二维码(生成图片文件)
2. 在生成的二维码中加上logo(生成图片文件)
3. 生成二维码(不生成图片文件)
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
前期准备:
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
方法解读:
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
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:二维码包含的内容,可以是链接、文字、json字符串等等;第2个参数outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
第3个参数level:默认为L,这个参数可传递的值分别是L(QRECLEVELL,7size:控制生成图片的大小,默认为4;
第5个参数margin:控制生成二维码的空白区域大小;第6个参数saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
使用示例:
1. 生成二维码(生成图片文件)
function scerweima($url=''){
require_once 'phpqrcode.php';
$value = $url;
$errorCorrectionLevel = QR_ECLEVEL_L;
$matrixPointSize = 5;
$filename = 'qrcode/'.microtime().'.png';
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
$QR = $filename;
$QR = imagecreatefromstring(file_get_contents($QR));
imagepng($QR, 'qrcode.png');
imagedestroy($QR);
return '<img src="qrcode.png" alt="使用微信扫描支付">';
}
echo scerweima('https://www.baidu.com');
2. 在生成的二维码中加上logo(生成图片文件)
function scerweima1($url=''){
require_once 'phpqrcode.php';
$value = $url;
$errorCorrectionLevel = QR_ECLEVEL_H;
$matrixPointSize = 6;
$filename = 'qrcode/'.microtime().'.png';
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
$logo = 'qrcode/logo.jpg';
$QR = $filename;
if (file_exists($logo)) {
$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_height = imagesy($logo);
$logo_qr_width = $QR_width / 4;
$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);
}
imagepng($QR, 'qrcode.png');
imagedestroy($QR);
imagedestroy($logo);
return '<img src="qrcode.png" alt="使用微信扫描支付">';
}
echo scerweima1('https://www.baidu.com');
3. 生成二维码(不生成图片文件)
function scerweima2($url=''){
require_once 'phpqrcode.php';
$value = $url;
$errorCorrectionLevel = QR_ECLEVEL_L;
$matrixPointSize = 5;
$QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
}
scerweima2('https://www.baidu.com');
*前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
一、使用谷歌Chart API生成URL二维码
完整的API地址:
参数说明:
cht - 指定一个QR码
chs - 图像大小,单位是像素,是宽x高
choe - 字符编码,默认UTF-8
chld - 分两部分,格式为等级 | 边距。前者是错误校正等级,默认7% L-默认纠错水平,可以识别已损失的7%的数据;M-可以识别已损失15%的数据;Q-可以识别已损失25%的数据;H-可以识别已损失30%的数据;后者是生成的二维码离图片边框的距离,可自行调节。
chl - 生成二维码的内容。包含中文时需使用UTF-8编码汉字,否则将出现问题。
实现:
function createQRbyGoogle($data, $width = '200', $height ='200', $choe = 'UTF-8', $EC_level = 'L', $margin= '0') {
$chl = urlencode($data);
}
$qrcode = createQRbyGoogle($url);
echo $qrcode; // 直接在浏览器中显示二维码
二、使用PHP QRCode类库生成二维码
前提:PHP需开启GD2扩展。
使用时引用phpqrcode.php即可。
phpqrcode.php提供了一个方法png(),代码如下:
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);
}
其中:
$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 - 是否保存二维码并显示,默认为false(不是很理解这个参数的作用,改为true也没见其他二维码生成)。
实现:
① 浏览器输出二维码:
include "phpqrcode/phpqrcode.php";
$errorCorrectionLevel = "L";
$matrixPointSize = "4";
QRcode::png($value, false, $errorCorrectionLevel, $matrixPointSize);
② 文件输出二维码(浏览器不显示):
include "phpqrcode/phpqrcode.php";
$filename = 'qrcode_' . time();
$errorCorrectionLevel = "L";
$matrixPointSize = "4";
$margin = 2;
QRcode::png($value, $filename, $errorCorrectionLevel, $matrixPointSize, $margin);
③ 生成带logo的二维码:
先使用PHP QR Code生成一张二维码图片,再利用PHP的image相关函数,将事先准备好的logo图片加入到刚生成的原始二维码图片中间,重新生成一张新的二维码图片。
include('phpqrcode/phpqrcode.php');
$filename = 'qrcode_' . time() . '.png';
$errorCorrectionLevel = 'L';
$matrixPointSize = 10;
$margin = 2;
QRcode::png($value, $filename, $errorCorrectionLevel, $matrixPointSize, $margin); // 这里参数filename不能为false,必须输出二维码文件
$logo = 'logo.jpg'; //logo的图片地址
$QR = $filename; //前面生成二维码图片的地址
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_height = imagesy($logo);
$logo_qr_width = $QR_width / 5;
$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);
}
$finalName = 'final.png'; // 带logo二维码的文件名
imagepng($QR, $finalName); // 最后生成两个二维码,一个为先前生成的不带logo的二维码,如qrcode_1505115861.png,一个为带logo的二维码,即final.png
上述代码最后生成两个二维码,一个为不带logo的二维码,如qrcode_1505115861.png,一个为带logo的二维码,即final.png。
如果想在浏览器中显示二维码,则将上述代码中最后两句改为:
header("Content-type:image/png");
imagepng($QR);
则在浏览器中显示带logo的二维码,但依然会生成一个不带logo的如qrcode_1505115861.png的二维码。
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011415782/article/details/76640540
I、概念拓展
1).一维条码
一维条码,是由一组粗细不同、黑白(或彩色)相间的条、空及其相应的字符(数字字母)组成的标记,即传统条码。多见于产品包装,可供扫描的地方。
2).二维条码
二维条码,是用某种特定的几何图形按照一定规律在平面(二维方向)上分布的条、空相间的图形(或进行抽象变形后的效果显示)来记录数据符号信息的标记。
II、QRCode(Quick Response Code)
1).二维码标准
目前流行的三大国际标准
PDF417 :不支持中文
DM : 专利未公开,需要支付专利费用
QR Code : 专利公开,支持中文
QR Code 比其他二维码相比,具有识读速度快、数据密度大、占用空间小的优势.
2).QR Code 基本结构
3).QR Code 纠错能力
L 级:约可纠错 7% 的数据码字
M 级:约可纠错 15% 的数据码字
Q 级:约可纠错 25% 的数据码字
H级:约可纠错 30% 的数据码字
III、代码实现
以下的代码实现,是基于ThinkPHP 3.2.3框架下的设计,但代码逻辑大同小异,代码已上传github,欢迎参考。
1).php 生成QR Code
代码实现比较简单,需要引入 phpqrcode.php 文件,然后调用 png()方法,可酌情注意该方法中各个字段的使用要求,从而更能符合自己的功能设计需求。
上述方法可直接访问对应的链接进行查看,为了符合html显示效果,自然也可以进行嵌入式的前端显示:
<img src="{:U('QrCode/qrCode')}">
链接显示效果显示如下,通过扫描即可获得其中的信息:
2).jquery 生成 QR Code
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<script src="__MJS__/jquery-1.8.0.min.js"></script>
<script src="https://cdn.bootcss.com/jquery/3.2.1/core.js"></script>
<script src="https://cdn.bootcss.com/jquery.qrcode/1.0/jquery.qrcode.min.js"></script>
<!--<script src="__MJS__/jquery.qrcode.min.js"></script>-->
<body>
<div id="qrcode"></div>
</body>
<script>
$("#qrcode").qrcode("Hello world");
$('#qrcode').qrcode({width: 64,height: 64,text: "Hello Baby"});
</script>
</html>
实现效果如图:
3).PHP 生成电子名片
首先,了解一下 vCard 的概念:
实现代码如下:
public function qrCode_vcard(){
vendor("phpqrcode.phpqrcode");
$content = 'BEGIN:VCARD'."\n";
$content.= 'VERSION: 1.3.1'."\n";
$content.= 'N: 毛球'."\n";
$content.= 'FN: 贝利斯'."\n";
$content.= 'TEL;WORK;VOICE: 18898989988'."\n";
$content.= 'TEL;HOME;VOICE: 17789889999'."\n";
$content.= 'ORG: 阿尔及利亚-安道尔'."\n";
$content.= 'URL: http:www.moTou.com'."\n";
$content.= 'END:VCARD'."\n";
\QRcode::png($content,false,QR_ECLEVEL_L,3,2);
}
QR Code 生成效果如下:
微信进行扫描后,可以得到下面的结果.
4).PHP 识别二维码
该功能个人觉得整理过于繁杂,但值得学习,建议参考附录视频,希望能帮助小猿们学到一丝有趣的东西。
IV、附录
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
发表于
一不小心,又开始“码代码”了,在此,Young Free 得特别声明:哥真不是学计算机的,也不是搞网络工程的!所有代码都来自网络,哥只是根据自己需要,拼接调整了一下。感谢开源源码的大神们,虽然,Young Free 也不知道大神们叫什么名字。
需求
嗯,码代码前,都是要先分析需求的。
Young Free 主题使用的云落的 Git 主题,这款主题,在文章也右上角,提供了扫二维码在手机上阅读博客的功能。之前 Young Free 一直在调用百度网盘的二维码生成 API,但前几日,百度突然关闭了这个功能,导致 Young Free 博客上的这个二维码功能失效了。
方案
利用第三方服务
几经百度,找到了多个替代解决方案,可大多数都不支持 https 调用,这里就不提及了,唯有搜狐快站支持 https 调用,调用地址如下
| https://www.kuaizhan.com/common/encode-png?large=true&data=https://www.youngfree.cn |
自行搭建
虽然免费服务也好用,但保不准那天也会关闭服务,于是,Young Free 就有了搭建一个自己专用的二维码生成服务的想法。既然要搭建,选用构架和脚本语言的问题就来了。
构架
根本谈不上构架,这么个简单的服务,选择一个脚本就行了。百度出来结果一大堆,对于 Young Free 来说可行的有 JAVA, Python, PHP 三种语言编写的方案。Java 和 Python 需要更新 哥的阿里云 ESC 环境,这个工程有点大,所以 PHP 是最适合的。接下来就开始继续度娘可用代码。
算法
PHP 生成二维码的方法一大堆,Young Free 要的是最简单的,所以,算法什么的也是浮云。利用 PHP QR Code 源码,2个文件就能搞定所有需求。
源码下载地址:https://sourceforge.net/projects/phpqrcode/
注意事项:PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
下载下来的一大堆文件,我们只取 phpqrcode.php 一个就行,另外一个 PHP 文件需要我们自己手动写一写。因为不需要在自己服务器上保存二维码,也没有美化的需求,Young Free 百度到了如下可用代码。
| <? //生成原始的二维码(不生成图片文件) function yfqr($url=''){ require_once 'phpqrcode.php'; $value = $url; //二维码内容 $errorCorrectionLevel = QR_ECLEVEL_L; //容错级别 $matrixPointSize = 5; //生成图片大小 //生成二维码图片 $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2); } //调用查看结果 ?> |
不需要美化的终极原因是因为搞不定 QAQ.
问题
这个代码,只能生成源代码里面写好的网址或文字内容的二维码,Young Free 需要的是直接通过 URL 来调用,显然需要改造一下。
既然源码中网址那里是 定量,那可不可以变换成 变量 啊?开干才知道。Young Free 一直在用一个站外链接跳转的中间页,里面就用到了获取 URL 中 跳转目标 URL 的函数。拿过来用用吧。
| <?php $url=$_GET['url']; echo htmlspecialchars($url);?> // 核心为 $_GET['url'] 这个函数 |
完善代码
| <? function yfqr($url=''){ require_once 'phpqrcode.php'; $value = $url; //二维码内容 $errorCorrectionLevel = QR_ECLEVEL_L; //容错级别 $matrixPointSize = 5; //生成图片大小 //生成二维码图片 $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2); } //调用查看结果 yfqr($_GET['url'],''); //获取目标网址的URL ?> |
到这里,大功就告成了。其实在 获取目标网址 URL 这个变量这里,折腾了好久,不懂 PHP 的结果就是不知道怎么“打印”获取到的变量为常量,尴尬。
加限制
可 Young Free 并不满足,这个调用地址是可以随随便便手动打开的,没有任何验证,Young Free 的博客可是经常遭到攻击的,不做点限制,VPS 的这点点资源岂不是扛不住。加点限制,非本站站内,不能打开。整个源码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <?php $name = "Young Free | 年轻人 无拘束"; function wp_die($home,$name) { <title>无效地址</title></head> <body><br/><br/><br/><br/><br/><br/><br/> <center> 此URL不允许直接复制打开....<br/> ---来自<a href="'.$home.'/">'.$name.'</a> </center> </body> </html>'; exit(); } if(empty($_SERVER['HTTP_REFERER']) || strpos(strtoupper($_SERVER['HTTP_REFERER']),strtoupper($home)) === false) wp_die($home,$name); ?> <? function yfqr($url=''){ require_once 'phpqrcode.php'; $value = $url; //二维码内容 $errorCorrectionLevel = QR_ECLEVEL_L; //容错级别 $matrixPointSize = 5; //生成图片大小 //生成二维码图片 $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2); } //调用查看结果 yfqr($_GET['url'],''); //获取目标网址的URL ?> |
调用方式
哦,说了这么多,怎么调用呢?
前台效果
啦啦啦啦~~~如下图,也可以把鼠标移动到文章右上角的 扫描二维码 试试。
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
前期准备:
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
方法解读:
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
1 2 3 4 5 | 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:二维码包含的内容,可以是链接、文字、json字符串等等;
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
第4个参数$size:控制生成图片的大小,默认为4;
第5个参数$margin:控制生成二维码的空白区域大小;
第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
使用示例:
1. 生成二维码(生成图片文件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | function scerweima( $url = '' ){
require_once 'phpqrcode.php' ;
$value = $url ;
$errorCorrectionLevel = QR_ECLEVEL_L ;
$matrixPointSize = 5;
$filename = 'qrcode/' .microtime(). '.png' ;
QRcode::png( $value , $filename , $errorCorrectionLevel , $matrixPointSize , 2);
$QR = $filename ;
$QR = imagecreatefromstring( file_get_contents ( $QR ));
imagepng( $QR , 'qrcode.png' );
imagedestroy( $QR );
return '<img src="qrcode.png" alt="使用微信扫描支付">' ;
}
|
2. 在生成的二维码中加上logo(生成图片文件)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | function scerweima1( $url = '' ){
require_once 'phpqrcode.php' ;
$value = $url ;
$errorCorrectionLevel = QR_ECLEVEL_H ;
$matrixPointSize = 6;
$filename = 'qrcode/' .microtime(). '.png' ;
QRcode::png( $value , $filename , $errorCorrectionLevel , $matrixPointSize , 2);
$logo = 'qrcode/logo.jpg' ;
$QR = $filename ;
if ( file_exists ( $logo )) {
$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_height = imagesy( $logo );
$logo_qr_width = $QR_width / 4;
$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 );
}
imagepng( $QR , 'qrcode.png' );
imagedestroy( $QR );
imagedestroy( $logo );
return '<img src="qrcode.png" alt="使用微信扫描支付">' ;
}
|
3. 生成二维码(不生成图片文件)
1 2 3 4 5 6 7 8 9 10 11 | function scerweima2( $url = '' ){
require_once 'phpqrcode.php' ;
$value = $url ;
$errorCorrectionLevel = QR_ECLEVEL_L ;
$matrixPointSize = 5;
$QR = QRcode::png( $value ,false, $errorCorrectionLevel , $matrixPointSize , 2);
}
|
前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
在线生成二维码工具(加强版)
http://tools.jb51.net/transcoding/jb51qrcode
在线二维码解码识别工具
http://tools.jb51.net/transcoding/trans_qrcode
更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》
希望本文所述对大家PHP程序设计有所帮助。