管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
" g' |' D6 C D! }使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。! U2 ?3 D( `; E2 [" S; l$ O
前期准备:
6 k6 B0 ~, T' D, f) B: j [ u# L1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/2 t) y* d. n$ t+ z/ D" }
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
# @ B% F4 J& u4 \: v方法解读:, F" J$ X) L* @6 F$ `6 ]! p
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
& w! y, f' v0 \- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)( n" D# N6 D0 v
- {
, t9 m1 B. D" e - $enc = QRencode::factory($level, $size, $margin);1 [+ x6 [9 ]' w4 H% B Y8 M
- return $enc->encodePNG($text, $outfile, $saveandprint=false);; t, s4 z2 G6 L2 r( U
- }
2 F( C; I; R ]! n; o
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;& P k7 q) Y2 P0 x: I9 n1 M
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
, A( U- e( G [# l% h& M 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
4 y6 `1 w( {& R7 d" A: ] 第4个参数$size:控制生成图片的大小,默认为4;+ b1 g4 u, b4 f
第5个参数$margin:控制生成二维码的空白区域大小;& R4 A; L v3 ]' u( H9 l! @( j
第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
, O; b$ `, T: H' ^& ^* K使用示例:
2 c+ A) z( \+ \2 E5 U+ G. C) f* B; k1. 生成二维码(生成图片文件)
! k8 S5 {( m4 R. ^' U- q L6 }- // 1. 生成原始的二维码(生成图片文件)- k: A) X9 b3 ^$ \9 i* p2 t
- function scerweima($url=''){$ t1 n- \3 o( g5 V: }
- require_once 'phpqrcode.php';/ a# ]. J: |5 h& ]% y. \
- $value = $url; //二维码内容) Q4 q' c; H0 M2 @$ R
- $errorCorrectionLevel = 'L'; //容错级别
4 Z* G+ M, k" X$ a9 p - $matrixPointSize = 5; //生成图片大小
O7 Y( r% X; H" f7 b0 K& g - //生成二维码图片
, P9 Z: o) c& ]9 B. a, R - $filename = 'qrcode/'.microtime().'.png';
) ]2 `* d. ^! I - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);- z0 I2 Q3 R0 i, B# I
- $QR = $filename; //已经生成的原始二维码图片文件 W. C( t) k7 ^3 X3 j6 s5 r
- $QR = imagecreatefromstring(file_get_contents($QR));
' ~( Q" k0 z2 j% n8 w6 b - //输出图片
% w8 Y. T5 V6 B. W. T5 \! L - imagepng($QR, 'qrcode.png');! i0 u( O+ H* j1 x' W3 R5 E
- imagedestroy($QR);
" Z8 e3 `! m: Z2 M/ ]' N - return '<img src="qrcode.png" alt="使用微信扫描支付">';4 P5 ^( e* n- v' a, T
- }
* {' M' X5 a8 j0 J( k - //调用查看结果
( Y2 m( T9 Y+ X9 f, D- B0 X* F - echo scerweima('https://www.baidu.com');- v7 Y9 z, P- \ i
复制代码 2. 在生成的二维码中加上logo(生成图片文件)
7 |) H# s$ |9 \5 C) s- //2. 在生成的二维码中加上logo(生成图片文件)6 P9 b0 S* m5 a2 E
- function scerweima1($url=''){
6 X0 j! x# _: b - require_once 'phpqrcode.php';
) b) W: K. ]6 D - $value = $url; //二维码内容2 \3 g; P- N9 W. t4 D
- $errorCorrectionLevel = 'H'; //容错级别; }. e/ {/ g+ _: b
- $matrixPointSize = 6; //生成图片大小
$ Y6 z; o8 u4 H2 y* P% V7 V; V! ` - //生成二维码图片
* s& y" N/ k! A+ J% { - $filename = 'qrcode/'.microtime().'.png';
# d5 E/ j+ E. ?# _- H _ - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);* f) U( Q+ y" `
- $logo = 'qrcode/logo.jpg'; //准备好的logo图片
0 ~* R+ {2 R2 a) P - $QR = $filename; //已经生成的原始二维码图
/ Z7 A3 ]3 I! ^ - if (file_exists($logo)) {
6 N$ a4 C; e" o0 T; ^/ l& R$ N - $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
3 Y- s/ d- \/ Q- t' p+ k - $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。/ ~: m( ^: T; R9 n" ~, P
- $QR_width = imagesx($QR); //二维码图片宽度
5 g" B6 X J4 D& E: l( h- q - $QR_height = imagesy($QR); //二维码图片高度3 j( E& X5 [4 X/ m$ M+ U
- $logo_width = imagesx($logo); //logo图片宽度
6 h0 m- n+ |! @$ W* m. ~6 A* j/ i/ _ - $logo_height = imagesy($logo); //logo图片高度
" c, `0 q/ B8 _7 W; y1 ?( k5 R - $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
7 A% X1 b& G* f/ y - $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度); P0 B% @; d2 x7 T$ k
- $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
# b; x5 ?( y5 i- I: V3 f - $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点5 S8 o) ?& _' Y( r( U. k
- //重新组合图片并调整大小0 W- D- I2 r% o& |
- /*
" y) G/ e# J& u# k0 O7 m - * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中' O. B/ E, n2 a
- */6 q' v2 j0 k1 ] P4 N
- imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);; `* a$ x4 c' h! d) G9 Z
- }
y, N# Q# U# Q4 Z - //输出图片$ L2 Y$ m4 X( k4 U
- imagepng($QR, 'qrcode.png');; K; C$ h4 h, u, ?" b. v+ Q
- imagedestroy($QR);, b+ t& s0 _4 F* u( h: J+ {0 D
- imagedestroy($logo);
% O% Z l& s- n8 U' I - return '<img src="qrcode.png" alt="使用微信扫描支付">';
$ t% K- Q& l( J8 L5 Z- z( \ - }* o i2 A s: J. h9 Z/ M' @
- //调用查看结果) t7 R" I# Q. S0 w% Z1 M# v
- echo scerweima1('https://www.baidu.com');
: e( o% e' z1 c2 R; ^: Y- O
复制代码 3. 生成二维码(不生成图片文件)
# k2 [8 @* t1 x* U! }0 P. X- //3. 生成原始的二维码(不生成图片文件)$ M3 D. A) L( \5 y) a
- function scerweima2($url=''){
+ e* W0 h; g- ]$ {7 M - require_once 'phpqrcode.php';
. n" X" _' L' z - $value = $url; //二维码内容( B" a; \- a* S7 i7 E
- $errorCorrectionLevel = 'L'; //容错级别
& L: J- d! U$ _! Y+ S3 t - $matrixPointSize = 5; //生成图片大小: J+ C) }9 O6 _7 N
- //生成二维码图片
" U" }9 O' F$ e- l& I1 N7 Z$ h - $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
F) Y* j" i5 k& l - }
1 y- C3 u# ?* u0 G" g" m2 o6 c8 d9 i - //调用查看结果% ^& X# r% Y1 p! @4 x+ }
- scerweima2('https://www.baidu.com');
# P0 g5 m7 o! L/ ?6 Z# W6 @6 _
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。2 Y1 S* P9 [* o3 ^: n; W
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
& ? [0 V# P5 s5 J# x在线生成二维码工具(加强版)
Q3 V7 ]! v3 k, h7 s5 u4 W" _http://tools.jb51.net/transcoding/jb51qrcode# I0 V; y* A9 L H& V* O; a
在线二维码解码识别工具
) P7 y' N& w( ^/ x7 g2 ohttp://tools.jb51.net/transcoding/trans_qrcode7 h* C' W5 ^ A" E
" Z' J- u: S% P5 m7 ^8 E
% s' G) {1 n3 H1 r9 x9 G* d4 j- C4 P! _; Z
]4 F* h2 b5 ~2 @1 u; X
) x/ u ?$ t5 f% s |
|