管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
6 v: j9 ?1 Y4 ~' P, d k使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。$ W% y5 G7 f& {2 O# \* m2 o
前期准备:) [+ w6 x1 O) `7 R
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/7 B& O+ U2 `# {1 S5 J/ u
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
% H( k! w' F! _& w方法解读:/ `8 K5 \( q6 ]
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
0 [3 y H" @. g- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)1 A+ M' H& Z! O. l3 L+ q/ Z
- {8 K g$ T' C4 k5 a7 J U
- $enc = QRencode::factory($level, $size, $margin);5 P! j0 B! J# V n8 O
- return $enc->encodePNG($text, $outfile, $saveandprint=false);
5 J9 J7 y9 ?. c; J - }
) e$ s% ?9 b8 R1 u' A5 r/ E
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;1 c, C0 c* d& R' n! n! m& \8 A$ c
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
0 o% D6 C, J! w$ Z1 }1 S6 K 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;2 Y5 k& j- J2 C* e& Q& X: k* R3 v
第4个参数$size:控制生成图片的大小,默认为4;6 y. P, Y& i8 z: \$ @5 r; B/ ]! k9 f
第5个参数$margin:控制生成二维码的空白区域大小;' ^$ r4 k7 \3 v& k; D0 }
第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
1 X4 ]! y4 R* B( f+ ~# K n- @使用示例:3 C, c0 B7 j R# r! K
1. 生成二维码(生成图片文件)
! {7 f" \( m4 E& {5 U% C- // 1. 生成原始的二维码(生成图片文件)
/ i* P- y* b" r: Y - function scerweima($url=''){
_6 F1 C. O# [) h) x - require_once 'phpqrcode.php';) W3 F' J6 U$ }
- $value = $url; //二维码内容) ?% j, e) m+ O
- $errorCorrectionLevel = 'L'; //容错级别1 }6 N7 \# F1 F
- $matrixPointSize = 5; //生成图片大小6 v# F% ]3 b" p. {* B6 j0 e
- //生成二维码图片
. U' q4 Y" i& w6 r - $filename = 'qrcode/'.microtime().'.png';
3 A2 y) t2 R* R0 B* s - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);, i" v1 V f) o$ P8 N
- $QR = $filename; //已经生成的原始二维码图片文件
' I; v- J( n/ X% m - $QR = imagecreatefromstring(file_get_contents($QR));1 |) p! X6 ]1 f# [1 y+ {, M
- //输出图片
3 o m: a$ E3 q$ E - imagepng($QR, 'qrcode.png');
( m _2 _8 b U3 U9 m. R - imagedestroy($QR);6 o f+ w2 a( T% _7 u
- return '<img src="qrcode.png" alt="使用微信扫描支付">';2 t7 \" M4 ]8 A: B# ~7 V
- }7 I' w9 W) b$ Z( J# ?3 n1 E
- //调用查看结果+ @' V& B9 s( d. Q9 m
- echo scerweima('https://www.baidu.com');2 S/ k! E1 F/ o6 ?5 l+ X3 g$ l
复制代码 2. 在生成的二维码中加上logo(生成图片文件)0 f+ @* l. ], r' }( N
- //2. 在生成的二维码中加上logo(生成图片文件)
0 C! ^% ]7 K1 C1 H - function scerweima1($url=''){
0 U5 e# M. H* g8 \, u+ X - require_once 'phpqrcode.php';1 U) y" T# b5 H
- $value = $url; //二维码内容
9 u! \/ ?/ C# B0 q - $errorCorrectionLevel = 'H'; //容错级别
8 v3 `, S, @8 G9 y X - $matrixPointSize = 6; //生成图片大小
H. r% H: x5 E/ E7 t - //生成二维码图片
) M* Y8 _* j+ t% M& P$ E2 s* a0 R2 F - $filename = 'qrcode/'.microtime().'.png';" J! A' O8 r9 f4 `3 i9 p5 q
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);5 `) Y6 F+ v5 J* V
- $logo = 'qrcode/logo.jpg'; //准备好的logo图片
/ h: B3 }2 C0 U, G - $QR = $filename; //已经生成的原始二维码图2 X$ h9 O& d' @. s( n. U/ l3 @
- if (file_exists($logo)) {
' m8 A3 h3 _$ q7 A3 R$ R/ r, f - $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
; f4 R8 O+ Y1 N# h" o; W( C/ N - $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。) s# P" ?) l# A
- $QR_width = imagesx($QR); //二维码图片宽度* n: t' a8 X. t8 c9 S9 r2 B
- $QR_height = imagesy($QR); //二维码图片高度
2 U: K. P* D' a" E1 k( T2 \8 h - $logo_width = imagesx($logo); //logo图片宽度
/ j! E9 i" E. l! Q7 l( X( W9 p$ J/ T - $logo_height = imagesy($logo); //logo图片高度
3 @! U- W3 D$ r& [; N - $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)! a9 ~1 U3 a. F! x, U
- $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)' p) n, M, M: c0 ]$ } c3 H
- $logo_qr_height = $logo_height/$scale; //组合之后logo的高度/ X/ t2 v a4 f! b/ l
- $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点' I h0 G- l; J7 l; e
- //重新组合图片并调整大小3 \" A: @% E; P8 X& g
- /*% |+ b- N2 w# k8 _
- * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
( [- D$ [ O. s - */1 ~% T% E- I- x+ Y9 j. f
- imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);1 k7 m# g# m' v9 r; j( z9 m! a6 i6 n* t
- }
- Y3 }; ]2 H) q6 Q- n, R& Q - //输出图片( R- o1 S" o& ]+ ~, f; n, \4 Z
- imagepng($QR, 'qrcode.png');2 c+ G6 p* a" b' g7 w
- imagedestroy($QR);
! B9 U8 d( D( o# ?# g( E: I% r - imagedestroy($logo);
2 D! J$ [' w. r$ u* o - return '<img src="qrcode.png" alt="使用微信扫描支付">';
% j2 [+ p8 q, b {" n - }
3 _: l) G+ R/ r. s3 G - //调用查看结果. o, B( M' z$ U9 ^
- echo scerweima1('https://www.baidu.com');: R; |6 B0 A. W8 E
复制代码 3. 生成二维码(不生成图片文件)( \( N* ?, e9 z: v
- //3. 生成原始的二维码(不生成图片文件)/ q3 D {* n* x* _$ g
- function scerweima2($url=''){
( d" ^5 N; d1 ]7 b( m0 {( N - require_once 'phpqrcode.php';! P' O+ H/ d+ P
- $value = $url; //二维码内容
6 ^/ v0 w; j- @& O - $errorCorrectionLevel = 'L'; //容错级别
2 p* p% I% T. W6 C8 g- H - $matrixPointSize = 5; //生成图片大小
9 ]' Z; ^% e$ D/ y - //生成二维码图片
- a9 o& F" G( e" C4 c. A7 d - $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
9 ^. x2 ? c6 C" s - }
# _7 R) I/ q' Y, a+ y - //调用查看结果
( v& _ a8 V7 X4 R! u" y/ e' T - scerweima2('https://www.baidu.com');
+ Z5 F+ x! @1 n- d0 U4 e- ?' Q
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
" k F9 ~9 w9 `3 c. bPS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:/ y0 ?6 G# Z2 S& b1 Q
在线生成二维码工具(加强版). e$ g+ A! D- z% P7 d% w
http://tools.jb51.net/transcoding/jb51qrcode3 Y* j: i0 _! n. o
在线二维码解码识别工具% t# g U( K) p8 d) q. i
http://tools.jb51.net/transcoding/trans_qrcode
2 O$ b. ]# G: z. o
3 Y8 M. q S2 [" C( ^: a3 d' H) A- v( X- e5 ]5 g3 c
8 x' v5 C: q0 A9 G$ M; d/ x( H, I* }- ]" j9 l% B0 O W7 B
. Z8 [ ?' V: Z! l( H1 [+ v6 o |
|