本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:- K" z! ~6 K/ Z( l" f
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
- k% a, h- ?0 D o! n前期准备:
' p' o7 j& B1 w3 t1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/
& C# J$ `' f0 h5 y: |" F 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)2 Z) l% K9 J( `$ T! I
方法解读:& ~+ ]- M! P( y; ^1 G
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):4 w- K- ?" u& Z% L8 @
- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
& W9 W6 d) _7 |5 z" z) _ - {" E9 z4 l( @3 {! v8 a& i- O
- $enc = QRencode::factory($level, $size, $margin);6 H$ |; y# Y6 J& ]1 ^5 t8 P
- return $enc->encodePNG($text, $outfile, $saveandprint=false);
$ @. S' l$ G" E' W - }
4 t# e9 ^2 i; J: g2 r
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;
8 k, s5 k5 M6 O8 K5 \ 第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
( f6 z9 |5 i m# o4 L; P3 e 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;$ V: k- _/ S* k
第4个参数$size:控制生成图片的大小,默认为4;
% f$ m; O- m8 z 第5个参数$margin:控制生成二维码的空白区域大小;
1 c1 z" P1 t, G J9 O0 P$ A 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;1 `8 f4 ~0 r! _1 J" t0 l6 S/ K
使用示例:) I, H/ F5 n1 |4 k
1. 生成二维码(生成图片文件)1 p( g( Z. J5 k5 L8 C2 r [
- // 1. 生成原始的二维码(生成图片文件)
! }/ n: S# t( P/ s, \1 g4 R3 t% ^' r - function scerweima($url=''){" \9 o2 |, t" _8 }
- require_once 'phpqrcode.php';; M2 J7 e* Q% I, E+ b3 i
- $value = $url; //二维码内容8 y8 p6 D3 b1 I6 h t9 _7 a
- $errorCorrectionLevel = 'L'; //容错级别
5 D, e5 q* [6 J - $matrixPointSize = 5; //生成图片大小8 \+ o- N# m3 o8 f" i
- //生成二维码图片' `8 A9 V0 r A# e
- $filename = 'qrcode/'.microtime().'.png';1 Z9 g$ m+ y( [8 K1 m2 C
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);1 U# s7 h3 p, g# o6 \/ S
- $QR = $filename; //已经生成的原始二维码图片文件
: Q' J; q" R- q, I- s9 f9 x* { - $QR = imagecreatefromstring(file_get_contents($QR));/ q, h/ h: x; R1 D
- //输出图片
2 ^ _, @0 k; g" U6 M2 t5 Y2 j# ~- I - imagepng($QR, 'qrcode.png');
& @; K/ h6 P0 u3 R2 q; K - imagedestroy($QR);
5 Q8 l! S! A& P - return '<img src="qrcode.png" alt="使用微信扫描支付">';# F. q' S7 S4 j& e
- }, l8 z) N3 T& h0 Y0 b
- //调用查看结果
- r2 J; n/ @( {5 |3 b) L8 j - echo scerweima('https://www.baidu.com');
: H) W; ^) {9 M/ @% a1 K
复制代码 2. 在生成的二维码中加上logo(生成图片文件)
+ l! Q- Z" w7 O8 R H# w2 {- //2. 在生成的二维码中加上logo(生成图片文件)% r4 v$ K. c7 \# K3 L* \: s
- function scerweima1($url=''){
. U, y. }6 u5 g8 E - require_once 'phpqrcode.php';7 K! x. v) y1 ^. i9 L
- $value = $url; //二维码内容
- ?, X. i: k4 Y - $errorCorrectionLevel = 'H'; //容错级别
! E+ H4 V6 ? ]9 c! t J$ h* r - $matrixPointSize = 6; //生成图片大小! t& i- \# L) g
- //生成二维码图片
5 p& T% L6 x1 m4 ~2 k - $filename = 'qrcode/'.microtime().'.png';
0 H& d9 _) a& Y - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
7 y( l6 ]8 w6 y& J" z - $logo = 'qrcode/logo.jpg'; //准备好的logo图片
7 \% i3 L. b6 P7 P$ T3 ]. [8 I - $QR = $filename; //已经生成的原始二维码图5 o4 \' \: w6 e- c* n
- if (file_exists($logo)) {
+ r2 }$ D2 t* i - $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
. T+ E' a, [0 c( G3 }: z! x2 c - $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
; D6 e. e$ @8 I$ t. a$ @; y9 x5 \ - $QR_width = imagesx($QR); //二维码图片宽度
; P1 r5 F0 _1 W2 v+ n4 Z: K - $QR_height = imagesy($QR); //二维码图片高度- H [# I% B/ ?: ?; R
- $logo_width = imagesx($logo); //logo图片宽度7 `' {0 Z6 O7 j9 g# A
- $logo_height = imagesy($logo); //logo图片高度8 v, ~$ n' F! V# J" i* K
- $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)% p% |! Y+ }/ e7 U! }3 i
- $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)( R3 B7 |, U9 y: D. ?
- $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
X( k! y' A$ [) U - $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点* T; @9 B( ^! o# z2 A
- //重新组合图片并调整大小) a9 X% g5 {8 O! v, q& p3 V
- /*9 d1 N N! `- w" z# u
- * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中8 b/ z, z( ]% ~3 M i# ]' g
- */7 a# ~; E5 O |1 {4 O
- imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);" \% }: p" c w' E. j" Q
- }% D2 F7 p! Q8 ]+ j( K3 _( r
- //输出图片2 @8 l. i) Y* y0 L5 B( D/ K
- imagepng($QR, 'qrcode.png');
- ]7 @2 A8 P2 d" D6 C - imagedestroy($QR);
" {9 |/ p3 S& k0 ]% }3 G9 t - imagedestroy($logo);9 `7 x' v& n; Y, [4 b# u
- return '<img src="qrcode.png" alt="使用微信扫描支付">';! }. x$ {3 w2 C5 G6 r2 c9 g
- }1 K' J, S/ A& G
- //调用查看结果
% g5 e* d5 E! r- L - echo scerweima1('https://www.baidu.com');
* W R7 y6 _! i6 B
复制代码 3. 生成二维码(不生成图片文件)+ y. g5 e; _# d* F5 V
- //3. 生成原始的二维码(不生成图片文件)
3 x/ P! g$ L: c - function scerweima2($url=''){" q: U# ]8 U$ Y7 w
- require_once 'phpqrcode.php';0 `8 N8 p; V! `$ ~
- $value = $url; //二维码内容
7 `' q/ s! [: \( h) b - $errorCorrectionLevel = 'L'; //容错级别
6 Y( r. u! J% u. p, e C" _ - $matrixPointSize = 5; //生成图片大小& S2 y1 H( u$ n, E# p
- //生成二维码图片6 q- R+ J: y9 `9 x" [- N7 p
- $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
; `+ J6 J% j& O6 b8 J - }- h, y0 f( d' `& Q% I; C) |
- //调用查看结果 u3 y2 ]; A4 a1 g
- scerweima2('https://www.baidu.com');
$ Q$ N3 G( P! T. D0 y9 T4 Q
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。) V- [2 O4 |& l& B* I
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
) @ H2 h% n4 x {) d: s) e) V; o在线生成二维码工具(加强版)7 d8 n6 E; F* w" h! ?
http://tools.jb51.net/transcoding/jb51qrcode
& |2 B, @0 R+ {8 I3 z在线二维码解码识别工具+ U: P5 X* G, H3 v8 X2 ?
http://tools.jb51.net/transcoding/trans_qrcode& u; Q! p# i2 ]" z/ L9 b
3 J* |3 Z" I5 q# w
$ ]. v6 O# x- ?7 h: r! ^- S$ [
$ s, y- g, o% f; k4 \+ Q+ \ _
& d5 m, a4 `% e7 v1 |7 W& C, f* \" L |