本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:9 |' j: y6 D: v
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。! E. b: u; U$ N B+ v
前期准备:
p, J; [' |9 Y/ ?7 C* i: i1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/- a' O9 X- i) Q- L! h
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
' L. D& ~; m1 o6 t) D$ B) k方法解读:
( n: I" Q" L7 l P下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
. ]* i# |2 [) h% ?1 k7 j- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) H! Z0 G+ i) F R: M
- {- O) `$ s8 g2 x7 \& ^! K" x
- $enc = QRencode::factory($level, $size, $margin);
9 M) z. h; N; z2 B" s, m2 H - return $enc->encodePNG($text, $outfile, $saveandprint=false);
4 D" R7 C7 o1 u) l - }
% Z% t0 ], c/ A% L. ^
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;
3 }8 x! D& ~( t 第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;# {4 ]/ A" \+ D# s! Z, {
第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
9 E1 K% p* i5 g, B& M 第4个参数$size:控制生成图片的大小,默认为4;" V8 b+ y- c: a$ m4 J# O1 z! w3 J( q
第5个参数$margin:控制生成二维码的空白区域大小;
8 h" k" J7 A Y9 o- J( w' Z2 X' \ 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;) A' C& [. z6 j% i' _; g
使用示例:
+ I- }+ b/ o6 v1 S8 a4 u- `% U1. 生成二维码(生成图片文件). x( K! a3 S2 g6 |
- // 1. 生成原始的二维码(生成图片文件)
& x* v5 A0 [9 O6 Z - function scerweima($url=''){
5 ~; Z) ^, F. _# x: o8 e - require_once 'phpqrcode.php';
: b; r! l: o. D8 r# w& S2 i - $value = $url; //二维码内容1 P0 g- i. u5 _! _( S
- $errorCorrectionLevel = 'L'; //容错级别
" b; v$ k: t: H7 _, S - $matrixPointSize = 5; //生成图片大小: F8 ]6 S7 l4 D4 Y8 w% W
- //生成二维码图片" b& `+ l9 J8 P
- $filename = 'qrcode/'.microtime().'.png';
. p# n' ?& G2 m" E E& D+ C. [2 s - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
( r" P. @+ _0 ^ - $QR = $filename; //已经生成的原始二维码图片文件
2 P" D x! r5 T2 q+ m - $QR = imagecreatefromstring(file_get_contents($QR));; S2 |6 w. W5 w9 h8 ^, _
- //输出图片, n {( z2 N+ E4 ~6 E# z: @- J
- imagepng($QR, 'qrcode.png');
; }# u# y2 w! b; v - imagedestroy($QR);& m, x% D& d) J5 o: m
- return '<img src="qrcode.png" alt="使用微信扫描支付">';' F/ K2 Z% b# s; H# t8 s
- }
0 i* z9 F8 O& N' ~- |; M - //调用查看结果
6 Z7 M1 |9 _4 _# [/ N0 ~ - echo scerweima('https://www.baidu.com');& {: z k% G4 \. ]% ?5 ~, Z1 u! }( c% }2 A
复制代码 2. 在生成的二维码中加上logo(生成图片文件)" H: T! O) C+ i9 T$ s* z) ` R) h7 {
- //2. 在生成的二维码中加上logo(生成图片文件)
: Q* _$ w. w( S" k" F) V2 A9 C# C - function scerweima1($url=''){+ s9 f" Q9 o; k# Q
- require_once 'phpqrcode.php';
. X# }1 ~5 b% @8 h% ^ - $value = $url; //二维码内容" Q+ d9 t- W; q
- $errorCorrectionLevel = 'H'; //容错级别8 ?; q9 \" n0 R! {7 |" x
- $matrixPointSize = 6; //生成图片大小
+ d( c) ^: h; S( d - //生成二维码图片
8 P- S% |- ?( m/ S3 } - $filename = 'qrcode/'.microtime().'.png';: h( C: o7 p, M, D$ C5 N
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);, m6 s! l# F" I; N* z
- $logo = 'qrcode/logo.jpg'; //准备好的logo图片( f* T- u. r3 V6 [$ X
- $QR = $filename; //已经生成的原始二维码图
, G% A1 T5 `. G6 T) q9 H6 N, m4 | - if (file_exists($logo)) {8 y; A# p+ l, q( q6 L
- $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。. v: F4 j! B# ?1 r5 S6 K2 V1 b6 h
- $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
V9 u/ U% g1 u2 b - $QR_width = imagesx($QR); //二维码图片宽度3 x! g5 ]$ h9 n" V
- $QR_height = imagesy($QR); //二维码图片高度% ~( ^' u+ K, \. J" }" N7 q
- $logo_width = imagesx($logo); //logo图片宽度8 v4 D" ]4 o( `* B& m7 X, ~
- $logo_height = imagesy($logo); //logo图片高度0 h4 J& N x/ J8 m
- $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
( o+ S" B7 z! i1 v5 X) q - $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
7 _$ O* P$ M5 O( d8 f, U - $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
4 m6 a) J+ d; } O - $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点0 N8 R r3 u- a! ^
- //重新组合图片并调整大小
) ^2 t* \8 q! J; l1 m! m N5 B - /*; b$ h+ E+ j# }+ H
- * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
* G; I, S# Y3 P1 |( @' v& c ] - */
+ P- k+ N4 z% `) O% E% Q" a - imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
W. ^) w. B$ ?* s* E - }
5 z% U8 B' P' t1 ] - //输出图片
/ c2 F; M/ V5 Y8 k" ^ - imagepng($QR, 'qrcode.png');3 N, _" R4 s1 M0 j8 u
- imagedestroy($QR);( i8 n7 t3 N( U1 N7 J+ c
- imagedestroy($logo);2 Y0 o+ o- Y" w+ ^
- return '<img src="qrcode.png" alt="使用微信扫描支付">';) A0 Z' m) ?0 n! g
- }
' \4 p8 E" I6 X5 [) L2 n" l8 q - //调用查看结果$ X' L! Y! P z- w+ @
- echo scerweima1('https://www.baidu.com');
- H) ?4 G! \* I7 C% b' T2 t
复制代码 3. 生成二维码(不生成图片文件)
) c2 p9 i' z! x- //3. 生成原始的二维码(不生成图片文件)
& }, f: r) B" y# c" R1 X- c6 I; k - function scerweima2($url=''){ y' V8 b# j' w2 O M5 |0 ] v/ ?+ Q
- require_once 'phpqrcode.php';; Z0 ?6 Z9 y5 w
- $value = $url; //二维码内容
& h+ G* ^8 `# {5 g' T/ d - $errorCorrectionLevel = 'L'; //容错级别+ H+ u. Z0 _8 s' S" X+ i9 h4 } A' ^
- $matrixPointSize = 5; //生成图片大小+ o) Q. e" j! M- t4 i& Q% c1 f% l
- //生成二维码图片
+ x" i5 |7 Z" W9 }% `8 J( W; M - $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);! X0 _2 m( \5 U( ?1 F9 E( u4 c4 ?! K* N
- }
P2 o; P8 x; ]$ ^: T; o - //调用查看结果
0 O" I7 Q ?. T: I - scerweima2('https://www.baidu.com');8 | p0 q# L$ R, Y- i6 S* @
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。6 q, [- G( f7 J4 f, t: }
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:+ g# S7 d1 ]) G$ F% L _. j6 I
在线生成二维码工具(加强版)* X2 U9 ` [: E/ @6 B* x8 ?
http://tools.jb51.net/transcoding/jb51qrcode h' j4 |* I" y; ^) _9 y4 f
在线二维码解码识别工具
2 v' n, Y+ L3 u* t5 Qhttp://tools.jb51.net/transcoding/trans_qrcode
0 E3 {* V" C7 \$ d8 ~( ]5 ]4 q/ E4 W; b; V
; s5 J# z' c& E$ M7 P
8 q5 E! g/ ^7 d6 H/ S" ?* ], }! | ?# v
( A" [* d3 g0 Y
0 B1 T c2 B+ [4 n/ B4 U |