管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:2 _6 U4 E* Q+ J) E( F2 \2 C
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。% D4 \0 g4 e9 V
前期准备:" V0 M9 Y5 S+ q v2 f8 s' A; {
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/
( k1 Q) {8 Y( N3 D7 z 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
) N5 k" l4 b6 @" B/ @1 D9 u! e方法解读:: L( M/ f1 p1 r$ O) M# r% f6 t( C) \
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
3 \# D" S9 a& K4 s T; D' i- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
& V% j6 f @ v$ Z3 K1 s. C - {
6 J @" B9 y; u2 ]' X6 W' E3 S - $enc = QRencode::factory($level, $size, $margin);
$ V; K# H7 O1 y" O" z/ D - return $enc->encodePNG($text, $outfile, $saveandprint=false);
( Y0 ^4 t" E$ O - }
8 e Y% E2 ~0 J) ]
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;5 t% x9 S0 P* e6 I, k
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;" K6 p/ k1 p( O; b- e
第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;$ x9 J4 q: M! T8 s$ J8 S7 r
第4个参数$size:控制生成图片的大小,默认为4;8 P3 a3 ~; E- v9 _* a0 l* p: m
第5个参数$margin:控制生成二维码的空白区域大小;
9 ]2 K7 k$ l: a B+ ^+ P. j. i% ? 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径; S+ D X/ ]/ O6 h" E- M+ g
使用示例:7 Q+ K- f6 K+ y6 s- {7 F9 G
1. 生成二维码(生成图片文件)
4 y1 [, T I1 y d- W; a9 ]- // 1. 生成原始的二维码(生成图片文件)4 ^6 Q$ e3 c6 J# T# F3 |
- function scerweima($url=''){
, C' n8 g/ c9 Z0 D5 s - require_once 'phpqrcode.php';+ q) ?8 z* @" r+ E! ?* \ b
- $value = $url; //二维码内容
8 d! ]3 j7 g4 e7 q7 t/ O - $errorCorrectionLevel = 'L'; //容错级别
; w2 ^# s) N5 D3 E2 L# h - $matrixPointSize = 5; //生成图片大小$ R8 i2 e2 {- G f' D4 c7 U
- //生成二维码图片 f6 d* `* G6 d8 S6 H
- $filename = 'qrcode/'.microtime().'.png';
7 ^5 r% g& N- E$ c! ]* `" `0 ^ - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);4 z/ s; w) l4 Q& `* p3 Y
- $QR = $filename; //已经生成的原始二维码图片文件& @# G4 e6 @1 k' t' e
- $QR = imagecreatefromstring(file_get_contents($QR));; i' i ~/ r6 W0 t! J8 ]
- //输出图片" ^" L# @0 q4 o
- imagepng($QR, 'qrcode.png');0 F! f r- W9 q( Q$ W
- imagedestroy($QR);& y% M9 s9 I! G; `# d$ n
- return '<img src="qrcode.png" alt="使用微信扫描支付">';; L; u: x" t0 w8 |0 L
- }7 Q# a3 W0 F2 a1 |
- //调用查看结果
* \1 ^! @" P9 L6 u6 K - echo scerweima('https://www.baidu.com');
& u/ v* C k- R) H' X- U3 e
复制代码 2. 在生成的二维码中加上logo(生成图片文件)
% M( P) B$ k' T7 j. A5 e' s( [- //2. 在生成的二维码中加上logo(生成图片文件)2 H/ i2 F1 N' T* g1 ^$ Z! E
- function scerweima1($url=''){0 d' _1 V# D( X
- require_once 'phpqrcode.php';
- G% }+ \( m$ w' u - $value = $url; //二维码内容4 H" ]; d/ O- T8 ^: g/ ?, k( ]! k
- $errorCorrectionLevel = 'H'; //容错级别. O2 f* \) u6 {3 E6 J* ]- F
- $matrixPointSize = 6; //生成图片大小 o3 O! J- q, T! ~ u6 X
- //生成二维码图片. q+ B. c! R$ C; R7 n; l6 A9 v
- $filename = 'qrcode/'.microtime().'.png';2 {( Y5 U8 I+ W+ d8 l3 {7 Q- w9 ]
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
) Q) O+ o, c7 N& ?6 [, H2 T8 t" ? - $logo = 'qrcode/logo.jpg'; //准备好的logo图片
6 j( v1 c- S7 n4 R! Q - $QR = $filename; //已经生成的原始二维码图
6 v: H3 I% U* k, l9 r h - if (file_exists($logo)) {& E7 G- x- {/ k) N3 s0 x) x+ I
- $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。' V& w1 {5 c1 l1 z% Q
- $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。/ ]7 G0 {( a3 q0 s' I
- $QR_width = imagesx($QR); //二维码图片宽度
3 z# U/ n4 }7 W. a7 k: h - $QR_height = imagesy($QR); //二维码图片高度
" {9 \. V" k0 U. p( K3 X& S - $logo_width = imagesx($logo); //logo图片宽度# ?% v S# I+ u3 U1 t( |6 f0 L) U
- $logo_height = imagesy($logo); //logo图片高度
, B3 P+ C0 v Y9 _$ h7 k3 b& I( N - $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
: P" b; I! ?- s$ I+ I6 j3 _6 R - $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
. }, Q+ q9 d, j# M# [ d. e - $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
) L3 ?; r3 R8 ?1 z - $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点7 j2 c4 O* f$ W6 X
- //重新组合图片并调整大小9 l5 e4 t+ X1 Z0 v! M4 H) P
- /*% G+ k. W$ m2 ~ z/ s/ T
- * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中! [. K0 }. m7 {1 ~; M4 l8 t
- */; U) l% Z% r. e4 _ X
- imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
! F* ~. L" v6 R. R# e7 K - }1 G/ c( F n5 c. p( g( J4 e3 u7 n0 j
- //输出图片
, t2 Q. p2 c2 i4 V - imagepng($QR, 'qrcode.png');
. D8 z' Q3 g7 e# P+ O - imagedestroy($QR);0 `2 ^6 G& k( H3 _
- imagedestroy($logo);
" ?- H9 b0 J: F( F1 S - return '<img src="qrcode.png" alt="使用微信扫描支付">';: v1 R( h8 H$ m6 @
- }0 }& d; D# ?4 Z v- p4 J" y
- //调用查看结果! V$ ?( b" j# D
- echo scerweima1('https://www.baidu.com');0 g H5 d# H8 n; }" J
复制代码 3. 生成二维码(不生成图片文件)
$ @$ g0 u" F% u+ e% X& B0 X, @( m- //3. 生成原始的二维码(不生成图片文件) h7 O, s* a" |8 t$ H2 b8 k
- function scerweima2($url=''){
. \( w& }& Q0 |; } - require_once 'phpqrcode.php';0 W. |: n% }" A$ b) l2 O. r
- $value = $url; //二维码内容, m$ P: _+ _- P) V
- $errorCorrectionLevel = 'L'; //容错级别
4 c o; R2 V4 {! w8 K* d - $matrixPointSize = 5; //生成图片大小* D q& G7 G! w- m* [, }
- //生成二维码图片
( Y' v0 _- d9 N2 u2 W - $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
9 Y1 ~* z: }5 T' F - }
& \+ x; J* K5 Q |: J( J - //调用查看结果
. [5 L, Y0 ~9 w7 |7 @: y - scerweima2('https://www.baidu.com');+ T& x1 f1 D8 A- x: I
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
5 ^: Q# y( N W* R1 {PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
; u( T1 d. k4 Q! S) r在线生成二维码工具(加强版)! Z1 G+ }' P: U* ^' W
http://tools.jb51.net/transcoding/jb51qrcode
8 {$ l/ }4 i/ ]( T在线二维码解码识别工具+ I5 j: P& p) F- P6 C$ S4 O6 }
http://tools.jb51.net/transcoding/trans_qrcode
?* p+ U$ u: @
$ v5 C* A6 s3 S+ Q5 D8 g6 z, F# k
" X6 z2 u7 e$ j! [7 t( K: f9 ]: s* L2 ] w
8 x$ U0 h& j+ O. W+ M
: j/ @7 S% Q4 \' j" |9 _ |
|