本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:. n+ n( f8 n7 N$ t' H8 Z0 l
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
1 k$ A6 x5 H% J# [( M, N) Y- t' h前期准备:
* c* K- N! J3 V$ w1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/
* i* F3 W; s2 G% y# b$ a `3 U 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)" ?! i8 W' ?3 M9 x
方法解读:
9 C; v# \2 I9 ^4 u( x$ ^& _8 Q下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
# @. B v, S& u6 q0 S% s2 e- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
" G1 A! e) @: _ - {2 l, g, e9 ^ _8 j- Q
- $enc = QRencode::factory($level, $size, $margin);
+ k( [% r8 f- L+ R" V, B* h5 q - return $enc->encodePNG($text, $outfile, $saveandprint=false);* L* A% P; E' n9 a/ D: o
- }
4 c4 S |" f, }2 f7 b$ k, t
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;8 I7 }+ ~7 G: c% }: v. m# I
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;$ ?0 d9 @/ T h" [" p
第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;5 N* |9 k/ b: F& a- y( F$ e% }
第4个参数$size:控制生成图片的大小,默认为4;
$ |" j {0 u6 U) C! X 第5个参数$margin:控制生成二维码的空白区域大小;- V2 c5 J% {9 u/ ~; R, k
第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
8 _8 ]" I$ h& Y, N8 c( l使用示例:5 u% g7 V2 O, B2 h+ ~& U
1. 生成二维码(生成图片文件)9 r" H6 |) @2 A7 Y6 k' h
- // 1. 生成原始的二维码(生成图片文件)
: ?! T6 a8 ^! ~* \2 k( p5 k - function scerweima($url=''){) I, R J8 i9 W% K' `) l* H( P1 f/ e
- require_once 'phpqrcode.php';
- V, J9 h& w) R" n7 W# n% {4 M - $value = $url; //二维码内容
1 r9 G0 W$ H5 g# l - $errorCorrectionLevel = 'L'; //容错级别
3 q# p' m" `5 F2 _; p - $matrixPointSize = 5; //生成图片大小' K$ M: x0 W. ?; n( M
- //生成二维码图片1 T: h% {8 y* ^* b* D4 M1 z! d
- $filename = 'qrcode/'.microtime().'.png';3 Z% y+ t7 G6 v) v& t4 r
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
; ^$ ^# ^7 v% u0 _; W6 i - $QR = $filename; //已经生成的原始二维码图片文件2 V* `) ~% n3 t9 T# Q8 Y
- $QR = imagecreatefromstring(file_get_contents($QR));* c& v7 S1 W+ r3 z" G/ E' d
- //输出图片; q! S' C$ J3 z8 _. v- o. s. P! g
- imagepng($QR, 'qrcode.png');) Y2 b' a7 r# ]
- imagedestroy($QR);
9 J; O7 X2 q- o" V& z/ L! B3 h - return '<img src="qrcode.png" alt="使用微信扫描支付">';
, G1 V) q0 P* h) {; p ~ - }
+ W2 s) s1 c3 G0 }* N; j. ~ - //调用查看结果
, C0 T% K8 ?7 R& M4 l! I - echo scerweima('https://www.baidu.com');4 J2 S7 Z% W# v6 V8 F
复制代码 2. 在生成的二维码中加上logo(生成图片文件)" ~" D! C( u8 Z- L) y, N- i
- //2. 在生成的二维码中加上logo(生成图片文件)9 d3 B9 h/ p. v1 D: R
- function scerweima1($url=''){
, P' U: o* }! G$ N4 I - require_once 'phpqrcode.php';
, L- o0 ^" x0 U& U, W$ v - $value = $url; //二维码内容! Y# R5 j- z/ H2 ]6 R4 Q: _8 x
- $errorCorrectionLevel = 'H'; //容错级别
) W& {# M0 ]6 }- e3 v$ k# @* z* H - $matrixPointSize = 6; //生成图片大小5 l$ G6 S8 |+ Q5 O) X$ C
- //生成二维码图片
2 b* _1 k. B: _. s: o- K - $filename = 'qrcode/'.microtime().'.png';
- V1 N+ X6 p4 t3 ~# \* _ - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
& F/ j, _" j) y, d9 C - $logo = 'qrcode/logo.jpg'; //准备好的logo图片
, \! C: r! X( L6 v# e+ o. \ - $QR = $filename; //已经生成的原始二维码图
) P4 q' O7 R2 T1 Y - if (file_exists($logo)) {8 _) q: H. Y. q* r( A9 ~
- $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。( O+ _. I" A# j$ `7 z% N: [
- $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
2 g% i9 ]- ?7 A( [. y5 ~ - $QR_width = imagesx($QR); //二维码图片宽度% ]4 l. C9 v" t* S( {6 Z+ O
- $QR_height = imagesy($QR); //二维码图片高度4 N% e$ i2 L* B5 b4 O
- $logo_width = imagesx($logo); //logo图片宽度# B2 H: z+ k/ F' W$ J7 f7 [
- $logo_height = imagesy($logo); //logo图片高度
* N3 S0 k. A- l6 T7 Y- B1 [ - $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5); ?+ V' ^' K3 h" E2 ?
- $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)3 ?; r2 I$ m$ o$ }' x+ e
- $logo_qr_height = $logo_height/$scale; //组合之后logo的高度; g/ x$ M6 U0 b- R. T j
- $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点
) G5 ]& q7 ^9 [ - //重新组合图片并调整大小) d: k! a. ?1 I' R1 u! \, U
- /*5 K& T5 J4 U& ]1 R* V
- * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中9 W" U6 p) E1 R3 g# `
- */
$ e1 ^6 S |+ B: q# \2 ]4 ? - imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
z3 z' W7 A7 }4 s! h+ ?; Q( s - }' j2 F2 c9 b# s: l6 O2 @8 C( [5 ~, }
- //输出图片& p- ~- y( p' I
- imagepng($QR, 'qrcode.png');/ `+ M3 S6 F7 |8 V. O: s1 d
- imagedestroy($QR);
! P* F2 h8 Z# K - imagedestroy($logo);! R" p* c: ^3 n) x
- return '<img src="qrcode.png" alt="使用微信扫描支付">';3 K$ y I5 t p9 o0 _
- }
( M. {, [. _9 S; K5 O - //调用查看结果
+ @$ x! b k9 i/ X5 e j5 _ - echo scerweima1('https://www.baidu.com');
$ ~4 O1 }. C2 |; T1 g8 C0 b6 m) {
复制代码 3. 生成二维码(不生成图片文件)
* T* E: T' H* Q% F3 U- //3. 生成原始的二维码(不生成图片文件)6 p2 |7 t" M- q/ Q) i
- function scerweima2($url=''){
; k! z# u- \! z1 k, i% ` - require_once 'phpqrcode.php';/ b9 r6 A* W/ P4 w' q7 o$ @9 c
- $value = $url; //二维码内容
, x2 p( K T0 X6 p3 ~ - $errorCorrectionLevel = 'L'; //容错级别! X6 T9 W- |1 i6 v i" G7 {
- $matrixPointSize = 5; //生成图片大小9 s- J) T: [- I5 ~# d9 ^; N
- //生成二维码图片6 H( V% B8 t& m: `% q" x
- $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);4 T, s. `2 w- p2 ?, O2 `5 [
- }9 D$ u [8 q5 M: b4 g" U
- //调用查看结果! H* ?1 G! ~2 ?. m: r- v! k. e# W
- scerweima2('https://www.baidu.com');
, v) T5 Z2 Z9 P6 E- w
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。0 S' _! }; [( ]8 P' l2 H9 @
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
' v/ J5 o- c2 x9 i- m! V在线生成二维码工具(加强版)! N$ s6 c- N2 C+ W) H+ W
http://tools.jb51.net/transcoding/jb51qrcode
) l( T3 o2 A' i4 v$ I. w在线二维码解码识别工具
9 j6 I+ t+ _- {6 o# khttp://tools.jb51.net/transcoding/trans_qrcode3 o$ o, a$ D" N! L3 g
3 \& h$ f1 y" v1 s7 K6 ~2 P7 S6 A
& D! F: j7 o# t$ `; q/ I
! N5 t: E! g( h; v7 q! M- l
r! I W, J3 {( T
% Q" T% |, v; m% B: L M& Q+ x8 y
|