本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:; ]$ ]% p' N9 W% s. ]/ \
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
+ [( S$ e% `& R6 c& P/ ^/ P+ L0 j) g前期准备:( T" |/ m8 c2 q! `: c& d
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/' t$ H$ L+ r6 \4 N/ [( K
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
9 w; y% ~8 p: g1 U方法解读:
) Y7 h" Q+ h. n; j4 P) L下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
7 B2 A8 n( P w$ f# y0 }- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
& o2 o' H) J5 s& K1 C2 j9 u - {
+ i' X- D2 J3 w; ]; t - $enc = QRencode::factory($level, $size, $margin);
* _) A0 X W+ a; m3 u - return $enc->encodePNG($text, $outfile, $saveandprint=false);
$ i0 I0 G) \6 g# e6 i* f - }$ a( w8 o$ p7 }
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;( f3 g' x# f l
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
3 T+ F1 k9 z: t+ Q 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
0 H7 ]1 s% R" D# P; y; Y2 D 第4个参数$size:控制生成图片的大小,默认为4;4 w) ^$ X5 Q, }6 j, R: c
第5个参数$margin:控制生成二维码的空白区域大小;
% e1 X9 U |! m$ n5 T5 F2 ^! P9 z 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
3 g& {/ s* u2 u3 I( o0 P使用示例:
+ ]/ _9 L9 [0 S: h* c2 c: _1. 生成二维码(生成图片文件)2 O& b3 ]* h3 n' `+ d6 x* ?
- // 1. 生成原始的二维码(生成图片文件)
* `# m7 X$ ~0 A* B& F - function scerweima($url=''){
9 U5 s: n, ?% s" r2 u$ P- h - require_once 'phpqrcode.php';% i9 h- p! C8 d: b2 i
- $value = $url; //二维码内容
) w. w+ S0 T7 h0 y) K4 |7 j - $errorCorrectionLevel = 'L'; //容错级别3 Z8 \; W' J& |
- $matrixPointSize = 5; //生成图片大小
$ v+ O6 w# T! L) Y, ? - //生成二维码图片
% a9 `) A T7 F- R/ y ~0 q1 Y9 t8 l: V - $filename = 'qrcode/'.microtime().'.png';/ g' [8 t Q) ^- k+ N
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
7 A1 ]$ Y: g& p3 n3 i! G7 y! G" m9 l - $QR = $filename; //已经生成的原始二维码图片文件
$ x8 K$ H+ F' N% R: U7 o - $QR = imagecreatefromstring(file_get_contents($QR));$ [/ ^- E) L& \% z% Y
- //输出图片0 Z( E2 G7 T& l5 ?: d9 p
- imagepng($QR, 'qrcode.png');: b7 u5 W* o- p' ]8 i. u a
- imagedestroy($QR);
! d% x2 _, P4 g - return '<img src="qrcode.png" alt="使用微信扫描支付">';1 b6 v; Z- b, D2 [
- }
7 K1 F+ J/ H7 i2 z - //调用查看结果% ?9 i2 u1 H3 p" m l
- echo scerweima('https://www.baidu.com');
! T1 p$ g) Z# d# x1 u; U9 j
复制代码 2. 在生成的二维码中加上logo(生成图片文件)
% g$ x: B2 ~6 L$ D" M m8 k- //2. 在生成的二维码中加上logo(生成图片文件)
. K k* N. Q. T; ?: \2 a3 j- ~ - function scerweima1($url=''){6 A4 U! t0 U( ~7 q4 N- u8 c
- require_once 'phpqrcode.php';' n6 T0 l5 G% O0 z! [2 b3 e$ T
- $value = $url; //二维码内容) T: V8 P9 y5 u0 A% @+ ?
- $errorCorrectionLevel = 'H'; //容错级别) ?8 x' k4 W6 h/ k1 Q
- $matrixPointSize = 6; //生成图片大小/ a: i2 f' ]5 N' D
- //生成二维码图片; o0 s( K R5 J% M
- $filename = 'qrcode/'.microtime().'.png';4 J3 Z- Z# T9 ~! s
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
3 q1 t/ L H2 | - $logo = 'qrcode/logo.jpg'; //准备好的logo图片' a0 e6 u: l9 w9 J( H3 ]& R
- $QR = $filename; //已经生成的原始二维码图
6 c3 t7 n& d) E* U - if (file_exists($logo)) { x! v8 |5 e, K
- $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。) a0 e" H; t5 P' J
- $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。7 R3 y" H1 D) b' A
- $QR_width = imagesx($QR); //二维码图片宽度
8 e7 B7 Z4 \! U9 c - $QR_height = imagesy($QR); //二维码图片高度
$ L K, r& X) h9 N& a9 k - $logo_width = imagesx($logo); //logo图片宽度* g7 K$ L* m- g5 C" E1 ?
- $logo_height = imagesy($logo); //logo图片高度1 Y' |: n: D; N8 d2 u% |. M- X" a
- $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)+ g9 _, N% T9 ~7 f' O5 u2 k/ ?6 F. d
- $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
' @$ q8 |, D7 P; o- | - $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
% H. s5 N2 \ u) [$ s- e$ e# s$ k - $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点3 o" G7 n- g4 J7 e( X$ A
- //重新组合图片并调整大小- Z: M! I" S4 U7 g0 `! i
- /*! T- j8 f* `% v; X
- * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中$ {, C9 J, u& F& w5 s
- */
1 ^& O' F$ I# o( s1 g5 X8 F - imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height); @7 V# V) O/ u- u2 e! e) v8 ]1 S) k! S
- }+ S8 v# @' S! A: C0 g3 n
- //输出图片9 i2 t- c, P4 X1 ]) M
- imagepng($QR, 'qrcode.png');, C8 R! ` U- Y( T7 S1 G2 q+ [
- imagedestroy($QR);* _) e4 A% b# x& v% K/ D
- imagedestroy($logo);6 P/ E. A1 C( n" e
- return '<img src="qrcode.png" alt="使用微信扫描支付">';( a( L* g3 }. t" o! r2 |
- }
2 u5 _5 B# {* @$ \1 a9 O% s7 \ - //调用查看结果
$ ~# S! K1 J; E* ~* _, z - echo scerweima1('https://www.baidu.com');
2 o! Z5 W9 J0 ^- y$ t9 e2 h6 r
复制代码 3. 生成二维码(不生成图片文件)( J/ }! C( n9 |: D
- //3. 生成原始的二维码(不生成图片文件)
9 v9 y+ p, h: w1 h. q q2 Z- U - function scerweima2($url=''){8 ^/ }) F3 R, d; c) |/ j
- require_once 'phpqrcode.php';$ z5 b! a- \- i3 w5 w
- $value = $url; //二维码内容" X l$ w9 r# m
- $errorCorrectionLevel = 'L'; //容错级别/ {. d# n; E: E
- $matrixPointSize = 5; //生成图片大小
/ w3 T9 _/ d, D9 @ h( T" x N - //生成二维码图片5 R( L I/ C8 r" T, k
- $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);- y9 }# e+ }& f# o, {
- }
X: T5 i1 Y3 `0 A) U - //调用查看结果6 F4 f$ h5 G) W# s& |) L5 ^$ ?
- scerweima2('https://www.baidu.com');
0 k. @* y* ]+ \5 e& m% J
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
& C7 s- P. x3 R! q& j, I" b; K% x1 `PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
7 y) Y3 v7 H7 F* \' u5 z6 k在线生成二维码工具(加强版)6 `& J" g, P4 |( |$ a- H' v& i
http://tools.jb51.net/transcoding/jb51qrcode
7 j5 C3 ^% A" x7 Y5 u( Z2 v在线二维码解码识别工具
0 Z4 D' B S# c9 O& C+ x% nhttp://tools.jb51.net/transcoding/trans_qrcode) G2 f) @' O3 S) p
- b/ n- V: _' X( g4 u" v2 f/ H6 l9 B
( H! Q; S$ ?* D& Z" p6 y, \' R2 [: V
+ Q5 [/ T1 U) i5 w$ N8 f8 J6 h
$ Q/ v# L* K) v! a, Y5 [+ ^ |