本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
- T; w3 K4 Y: w9 s. l# b使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
3 H8 U1 e S: M. e. \& q$ u前期准备:$ z" @, O: W2 }. o7 G
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/0 T' y) a( P( c: O
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)! w- b1 h: r9 O( J5 X0 H; N
方法解读:# s. B- N ]2 ?6 d( ^0 Z f
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
$ f# i) O3 b% r8 ^3 x2 B8 k- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
+ L, O5 x( S1 D: A+ T - {$ k5 z& u4 u+ o$ j6 A
- $enc = QRencode::factory($level, $size, $margin);2 z& {. c! ^8 W. i3 l5 I; F
- return $enc->encodePNG($text, $outfile, $saveandprint=false);
* ^- m: F* |, u; n: q0 r m, b - }
7 u- `# R. C3 `! ?- Y/ Y
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;( F3 o- E0 s) ~
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
4 B# m. s" P! j 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;4 F0 O! d5 U% i* H7 k' a9 \0 |
第4个参数$size:控制生成图片的大小,默认为4;7 Y( k) ^9 m. v- S. n7 [, P
第5个参数$margin:控制生成二维码的空白区域大小;
8 q7 |7 f5 o0 v8 O, o: U 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
) E9 J# y+ J) J; c8 o$ @使用示例:! p9 |6 X- z4 f7 M4 L" T
1. 生成二维码(生成图片文件)
% f0 k; n. `# g) T- // 1. 生成原始的二维码(生成图片文件)* |; t' X- c& ]
- function scerweima($url=''){
- {# \4 }% d9 N% p9 Z# }7 L - require_once 'phpqrcode.php';
2 @' v$ l$ h9 @# P. r - $value = $url; //二维码内容
0 T$ g p3 b# t x* T - $errorCorrectionLevel = 'L'; //容错级别/ w% L5 a6 ~1 f5 z9 _
- $matrixPointSize = 5; //生成图片大小
, i A" H, o9 Y- I" ] - //生成二维码图片
7 U5 F# a; c$ B& K4 w( G - $filename = 'qrcode/'.microtime().'.png';+ w2 {2 ~; Z! z+ _8 Z
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
, @+ v- y' ~" ]3 N3 r. j4 G$ n - $QR = $filename; //已经生成的原始二维码图片文件
5 B( K# ^ ]9 @! j9 ^& P8 ~: w - $QR = imagecreatefromstring(file_get_contents($QR));# p5 X, ]" i% [* K7 }7 z
- //输出图片
1 B2 a P' b2 w5 q3 N - imagepng($QR, 'qrcode.png');
4 G* D8 q4 \3 L& l" O& x! n - imagedestroy($QR);& d) V3 e& g% p" I+ N- o0 y- N1 y
- return '<img src="qrcode.png" alt="使用微信扫描支付">';
' y3 D4 |* \$ B9 [' [( e' S - }
- C+ w R( M9 X# u8 a' b* j0 J - //调用查看结果
3 b) \, [9 M8 g( g( u4 U; g - echo scerweima('https://www.baidu.com');
% K6 t1 p) L$ y8 C
复制代码 2. 在生成的二维码中加上logo(生成图片文件)
7 g/ {( R8 }- K7 |: a0 E5 ]- //2. 在生成的二维码中加上logo(生成图片文件)
; t! p, f3 Y* b8 o% Q+ ^ - function scerweima1($url=''){
3 c$ o+ H' p/ i3 ] - require_once 'phpqrcode.php';9 W( B0 C% ?% V
- $value = $url; //二维码内容* @# b* m' c. f3 b% }+ j& u
- $errorCorrectionLevel = 'H'; //容错级别) O. j# k, c2 `+ q/ O7 Z
- $matrixPointSize = 6; //生成图片大小 I' D2 }$ V6 ?. J; l0 ?
- //生成二维码图片+ h" b! A8 J2 |* ?
- $filename = 'qrcode/'.microtime().'.png';
- Y0 A! E& Q0 B4 T, p - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);6 c; g. _ I( }& b3 @
- $logo = 'qrcode/logo.jpg'; //准备好的logo图片( V" j* U- _# F" l1 l
- $QR = $filename; //已经生成的原始二维码图
9 o9 S, s" R# p3 K - if (file_exists($logo)) {
/ L* }7 Q2 y" J5 ?; G' k/ q7 H8 W - $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。3 b# y& V/ ^ @2 k- R0 R
- $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
% F; k8 r2 a1 W* G# k# ~: u' b - $QR_width = imagesx($QR); //二维码图片宽度& [0 L6 N! c' W
- $QR_height = imagesy($QR); //二维码图片高度- u) y# \* v( U
- $logo_width = imagesx($logo); //logo图片宽度
, C1 N/ M8 K0 Z* |+ Q+ A [ - $logo_height = imagesy($logo); //logo图片高度
9 m8 l2 w/ B! H; ?6 p3 G+ P - $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)8 U. \5 k0 {: o
- $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
$ m7 A) M, S$ F! Q# _% h - $logo_qr_height = $logo_height/$scale; //组合之后logo的高度+ v7 c5 s9 U2 C5 N8 t
- $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点0 Y; m- L7 S+ j! ~
- //重新组合图片并调整大小7 P, H8 ^- n5 H5 X
- /*1 ^! J# n9 r' z- b7 G, o% V0 C3 m
- * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中! F+ j# q. E. M4 g
- */
( i/ U4 G9 q4 o/ g$ J! m - imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);7 ^# |5 z X U' G" ^
- }" a7 s$ v* k/ H- S8 w
- //输出图片: M( s/ `1 U. c3 V
- imagepng($QR, 'qrcode.png');
7 |5 O: K7 I9 ?! y7 X - imagedestroy($QR);" e2 I! f' _" E8 j! r( a5 W c
- imagedestroy($logo);8 `5 v, A$ W! U* k$ _# L
- return '<img src="qrcode.png" alt="使用微信扫描支付">';
' a2 z3 L" o' p& m8 H - }
8 n* l. ~4 _# K; L" ] - //调用查看结果% N3 }$ n- x# Q/ h4 X; c( E$ w0 m
- echo scerweima1('https://www.baidu.com');
" k9 N" ?" M/ w0 C( j0 p6 C
复制代码 3. 生成二维码(不生成图片文件)- l; F# Y1 |( ~7 `6 K* V
- //3. 生成原始的二维码(不生成图片文件)
8 j" F1 H. D" {) [+ m% w - function scerweima2($url=''){+ E0 \8 R+ g1 X& O- G
- require_once 'phpqrcode.php';
& Y8 a# x) g) y$ I - $value = $url; //二维码内容
/ C3 G8 Y3 k7 K' G: { - $errorCorrectionLevel = 'L'; //容错级别
' q) Q$ |. u: j0 g! Y1 w/ ^. O - $matrixPointSize = 5; //生成图片大小
, I/ `' l; Z1 s/ e - //生成二维码图片
4 i) @; I. @% K. q$ I - $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
% e3 A( [+ b% D9 y' ^$ q& h - }
1 y0 w+ R9 \7 \8 q - //调用查看结果( U0 D$ }0 V- M6 d
- scerweima2('https://www.baidu.com');
6 N, g% F2 \, B) M& w; ^ w( O/ f! W
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
7 V: J; [7 i6 J8 ~PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:) e ]/ h2 K, Y: Y
在线生成二维码工具(加强版)
. i5 U+ j2 |& p$ i' v/ F' Z+ Z( _http://tools.jb51.net/transcoding/jb51qrcode4 m5 h( f& ~. G) I% U
在线二维码解码识别工具
3 e: T8 x5 w% i# n% C+ o, F9 A% ghttp://tools.jb51.net/transcoding/trans_qrcode
& R& j" z% G8 q0 V! z# D R
: U' U% \- H+ o6 J# _; F( m8 k7 ?3 W, e" ^
( K' M0 s0 h& b- W W
`6 [4 m% ~% x1 Z! Y
6 s( l8 S. w8 _' F |