管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:( o& g) w& L8 W& l( m: R1 i; t
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。2 ]5 Q) [; Z- x C+ A9 M* a+ j% t- f1 q
前期准备:
/ j9 P* z4 e7 x2 V* v- T# q1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/ f( `$ i @: e% f* m' _5 u
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
0 }- ], Q9 \2 K方法解读:/ @, a( P$ j( I6 ^4 Y; u8 ~
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
$ V# {4 \/ L. Y: f0 n7 z0 R+ `. ^- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)* b5 ]: S7 o3 S1 A* H
- {
# e; m' L2 J. A: I: x - $enc = QRencode::factory($level, $size, $margin);
" e2 m* t1 e; @ - return $enc->encodePNG($text, $outfile, $saveandprint=false);$ f& P9 T- J8 J( l" X8 P
- }
4 u* y8 G5 B3 A0 d9 L0 F
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;
; V' d3 T6 q( `4 }$ \ 第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
! Q& p# u: W% X2 M; A9 {0 Z 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
1 M) T) h1 h# x/ D; T$ Y, h 第4个参数$size:控制生成图片的大小,默认为4;
* I8 M. s" E S( C; H 第5个参数$margin:控制生成二维码的空白区域大小;
& n3 `- O$ n# r# G 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
4 G. r* u6 Y8 v9 y; N, l( E使用示例:% S$ Y, Z0 z# I+ |' ]
1. 生成二维码(生成图片文件)* t, }1 ^0 j# Q4 o! e% ?
- // 1. 生成原始的二维码(生成图片文件)! z& m: w4 U' P9 O) \1 q
- function scerweima($url=''){
0 ~6 W; i, Z4 S2 v" [' i6 U6 I - require_once 'phpqrcode.php';+ D, i4 D5 b9 \/ v% o
- $value = $url; //二维码内容
7 ]9 }. Z- j$ o h9 {2 Y - $errorCorrectionLevel = 'L'; //容错级别& q, `' F: M% ~6 }
- $matrixPointSize = 5; //生成图片大小
- p+ x# D2 S) a- ]% R7 k - //生成二维码图片4 d; L, a( n+ w* C+ `) A
- $filename = 'qrcode/'.microtime().'.png';* a3 G4 {/ O3 `& X+ J
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
+ n6 q1 o, U+ N9 g* s/ ^' c6 Q - $QR = $filename; //已经生成的原始二维码图片文件
* d0 I& D" p5 p" B1 A - $QR = imagecreatefromstring(file_get_contents($QR));0 M* \! z. |% u1 ?
- //输出图片
0 E0 f8 W3 {2 M F4 v - imagepng($QR, 'qrcode.png');
5 p2 H k0 C. m+ L - imagedestroy($QR);
& K4 G2 u5 R6 B" C - return '<img src="qrcode.png" alt="使用微信扫描支付">';+ b: O. o8 Q8 B$ m- a* U: J9 x
- }
7 f+ f0 l! [* z+ j9 w) e5 a5 A - //调用查看结果' |8 K9 H4 f, }: X. d
- echo scerweima('https://www.baidu.com');0 F6 k6 j( l; b6 z/ P1 W& Q
复制代码 2. 在生成的二维码中加上logo(生成图片文件)8 K- S& y( |" w4 F) B, s" S
- //2. 在生成的二维码中加上logo(生成图片文件)
. q* ?" l9 ^/ p& D' @7 Q - function scerweima1($url=''){* d- } _' @2 |: t
- require_once 'phpqrcode.php';" i9 l( ^. b# U" D" K$ O P
- $value = $url; //二维码内容
9 N3 A5 p! x+ U: A+ j! O - $errorCorrectionLevel = 'H'; //容错级别
: I' ^6 [ {' M" D) G1 i - $matrixPointSize = 6; //生成图片大小7 ]0 N5 k& Y" Q( V
- //生成二维码图片0 E& y" m7 ?& \" Z6 o8 |, I8 e
- $filename = 'qrcode/'.microtime().'.png';
$ Q$ @2 L8 f- _, v! L - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);: n0 A" G7 J* W9 V% u0 K6 w
- $logo = 'qrcode/logo.jpg'; //准备好的logo图片9 B4 ]( C8 y+ s3 {8 e
- $QR = $filename; //已经生成的原始二维码图
3 g2 B2 m) N; d X, ?5 u, t - if (file_exists($logo)) {* Q8 s" B! @9 F( {4 K! F
- $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
1 |6 o9 c& T- Y! m( |/ _1 B/ R - $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
% m$ d8 w& h5 m - $QR_width = imagesx($QR); //二维码图片宽度6 H8 e+ f; F G: h- a3 h+ O
- $QR_height = imagesy($QR); //二维码图片高度3 L( M/ P) R" \( O. Y; O0 h
- $logo_width = imagesx($logo); //logo图片宽度
7 F. h# ]2 H" R, h4 e' s$ V3 S( D - $logo_height = imagesy($logo); //logo图片高度5 p. \, `: P& h) b+ P( C6 ?6 D
- $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)/ [4 } y4 k! ]) l4 q0 i# a
- $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)- ~! x) q' A! S
- $logo_qr_height = $logo_height/$scale; //组合之后logo的高度! w9 m1 h* n% t* f
- $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点
$ ]: E- N/ ~1 b - //重新组合图片并调整大小
! v) [7 N! ]: z5 L+ ^1 f2 \ - /*
6 P3 ` `& m$ M8 s% p - * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
: O( y+ r: E3 g2 i4 K. n - */& w0 d9 E6 Y& R1 Y- r4 j
- imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
7 o9 B2 O* q4 p2 G/ t# h5 m) Q - }) `* b r: K9 q
- //输出图片 m& `) {5 {. \$ B1 G
- imagepng($QR, 'qrcode.png');) E/ ~# U N( Z' J# \; |" G
- imagedestroy($QR);
8 c8 W, q4 R5 B4 q* f& m, r+ ? - imagedestroy($logo);# v7 }" s1 I7 r5 o' j6 }
- return '<img src="qrcode.png" alt="使用微信扫描支付">'; a2 m W- b# ?1 U; k
- }
. P- O7 c2 R& ?- O+ E; S - //调用查看结果
# p; ?- f% ]# t8 X - echo scerweima1('https://www.baidu.com');$ q/ p, g+ Y0 P+ T
复制代码 3. 生成二维码(不生成图片文件)0 Q& p! t/ {) u F# n
- //3. 生成原始的二维码(不生成图片文件)
& g' s8 g% c a+ ^' ~ - function scerweima2($url=''){
- s l$ n' q& K7 A+ S - require_once 'phpqrcode.php';- Q7 t: _* Y+ r7 x# x2 D4 E
- $value = $url; //二维码内容
6 A0 ?# Y/ w+ \+ m - $errorCorrectionLevel = 'L'; //容错级别; }1 E% q; I* M# t
- $matrixPointSize = 5; //生成图片大小8 v* h* p3 s9 o
- //生成二维码图片
/ Z* B" n6 R' l4 H7 m' i) q$ T. L - $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
4 y2 L7 G4 ~# E7 h) K5 c - }2 [, M2 @ I9 r* N8 y' n
- //调用查看结果
# U5 T" _- p4 s5 x - scerweima2('https://www.baidu.com');6 y9 z3 w) R6 u7 ?1 J1 [ h
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
% ~+ |1 j/ V% _ O+ S( [PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:# u7 [( R7 I/ M: \
在线生成二维码工具(加强版)
. K; \* b3 w2 U+ [, I) T& Shttp://tools.jb51.net/transcoding/jb51qrcode
- A% ^# O- f6 H在线二维码解码识别工具
3 D/ X9 g+ H7 \http://tools.jb51.net/transcoding/trans_qrcode
! v$ l! I. k8 o6 G. ?( q$ g1 q; \* E X
' {: G8 N& A! \( `% K+ U
) j9 W. o6 k; R( Z1 Y$ ]3 R6 B
& g- ?5 n1 q! S. S3 S5 @" t6 ~: P+ P6 U! w( R Q1 w
|
|