管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:6 {% Y" ]; V' z% q0 G3 k
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。/ X8 X* ~5 w6 z6 J3 |) O# A
前期准备:
2 a" g& p8 q" Z7 R1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/
( D3 h( @2 h+ }9 d9 E) p8 O 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
; w9 h2 m B+ |1 N2 j7 t方法解读:
. ~/ O: j4 x: u8 U/ d+ H% P下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
& M7 ?0 t6 [8 Y+ C7 s' k- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
8 A/ `! C) h8 B& | - {) c; A- U- ^8 S+ I! {, ^
- $enc = QRencode::factory($level, $size, $margin);$ E: Z! z* b% o- C" l4 |! u
- return $enc->encodePNG($text, $outfile, $saveandprint=false);
1 d; @$ A7 @4 {3 f( w5 \2 K( g - }# {+ M0 i% h# p, m
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;: t3 O" t1 U" h9 d: M& C
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
7 V* k M3 s; @9 }1 K4 E; s# k+ S0 j 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;% W- z8 w" B; _/ d' u4 ~0 g ^# [* e
第4个参数$size:控制生成图片的大小,默认为4;) E( [* P, D6 b. V3 N
第5个参数$margin:控制生成二维码的空白区域大小;4 X, L" }# S7 b/ n8 H
第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;5 _9 U& }) n2 G1 K4 |
使用示例:
. W" j( L9 ^ u1. 生成二维码(生成图片文件)* M- E% P* f- A& A
- // 1. 生成原始的二维码(生成图片文件)$ H+ c! q9 m9 z; a
- function scerweima($url=''){
6 Q1 l8 i& q1 S& D& i - require_once 'phpqrcode.php';
1 ^8 ~- G' M% n4 J; ]$ m( \" | - $value = $url; //二维码内容
; E6 ^& \8 T8 i% B$ q$ t0 b7 H& O - $errorCorrectionLevel = 'L'; //容错级别
O: e' Q* f# t4 d' k1 {# i - $matrixPointSize = 5; //生成图片大小/ A) f4 U3 o1 y. t& b* n
- //生成二维码图片
/ l2 N; R# c9 ] - $filename = 'qrcode/'.microtime().'.png';$ s; V- I& x; R" V$ ~, I
- QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
; l9 s" b! w6 ]" @' g - $QR = $filename; //已经生成的原始二维码图片文件: i; p; ^" T8 _
- $QR = imagecreatefromstring(file_get_contents($QR));
- |3 M' W1 R& ?5 s5 W5 R5 @* a - //输出图片* ]% G+ T+ W5 z/ K$ m3 w5 U! V
- imagepng($QR, 'qrcode.png');" d" I. |' o- j1 b1 ^' w
- imagedestroy($QR);
! ?9 J$ M0 m; o& v, ^( `5 J - return '<img src="qrcode.png" alt="使用微信扫描支付">';
, h# { A4 @4 ~. t8 o: x - }
5 \9 {$ D3 {( I* Q3 p - //调用查看结果
8 G1 w" |8 B0 H' V- I- D - echo scerweima('https://www.baidu.com');
8 W2 U$ u, R _# S
复制代码 2. 在生成的二维码中加上logo(生成图片文件)
" z+ L2 R; p+ j# k) C8 t- J6 c( h- //2. 在生成的二维码中加上logo(生成图片文件)) f9 ]9 O: P3 l5 y/ V! a* v! Y* v; Z
- function scerweima1($url=''){
0 [$ K+ ` y- ^- {5 y - require_once 'phpqrcode.php';6 C* p+ P% P7 b. `, Y1 I1 p" \1 ?
- $value = $url; //二维码内容
* @0 k! g; k2 j4 x/ F8 q - $errorCorrectionLevel = 'H'; //容错级别4 @+ K9 c; Y3 G# |/ P
- $matrixPointSize = 6; //生成图片大小; H. q4 a" `7 y5 s6 X$ J1 n& I7 h
- //生成二维码图片
3 d& l% Y F Q6 W' G1 x2 ^ - $filename = 'qrcode/'.microtime().'.png';
; ]5 w# {( V1 B. M4 [3 N$ H - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);- I; A$ K3 e) @$ M3 _
- $logo = 'qrcode/logo.jpg'; //准备好的logo图片! T7 |, s3 j+ ^& Z U" h
- $QR = $filename; //已经生成的原始二维码图
, Y# g k( J% G1 f7 H' [. W/ \( h - if (file_exists($logo)) {
% k& {( x- K9 I* l& W4 f7 G - $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。2 e9 g1 x% N5 N9 G. y
- $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。- Y6 T S, Q! n" u! g, M! a4 M
- $QR_width = imagesx($QR); //二维码图片宽度1 Q" I5 [; a2 H
- $QR_height = imagesy($QR); //二维码图片高度
2 n/ d$ A: Z$ a% e( o4 A# E - $logo_width = imagesx($logo); //logo图片宽度
9 w3 i% p+ f2 X2 ]( r: T - $logo_height = imagesy($logo); //logo图片高度
1 y8 a* F$ b, A |/ V. v h - $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
% s" d- z& \2 K1 v+ X. Z - $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)) v- Z- e+ {* t) g% i4 {" }
- $logo_qr_height = $logo_height/$scale; //组合之后logo的高度# i3 O% _* r* q u: ]& U. x" p
- $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点
# m) W1 L0 m) u! \- {6 j4 e5 v8 z - //重新组合图片并调整大小
- K+ n0 p: d# U+ P+ K' Y - /*; H, p$ c7 V! m/ u
- * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
# x* Z3 w6 x4 l2 }( `: {& O - */
% D* ^3 {2 h/ y; a+ M+ H: e. e - imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);& o$ n/ h9 w& Q$ v# }+ h0 T( d
- }" Y) C% n% {: N3 f" k5 W# `$ _
- //输出图片" Q+ F2 ^# v! C6 p/ V# S+ c1 D/ w F. L
- imagepng($QR, 'qrcode.png');- R( C& Z2 e+ {, C' e) n1 K, S: T8 G* i
- imagedestroy($QR);
9 N# |0 [5 I# }# ] - imagedestroy($logo);
- |% i/ ]5 \; f H6 j9 ~ - return '<img src="qrcode.png" alt="使用微信扫描支付">';
7 V7 i3 p% q2 ~4 |0 a, [( p3 i - }5 ?* W. x7 d$ N- W, |
- //调用查看结果
) W. J5 x# n! ? - echo scerweima1('https://www.baidu.com');
1 |' S' d9 X3 L& \# p
复制代码 3. 生成二维码(不生成图片文件)
% h6 [: D- S2 P- w! |3 ]- //3. 生成原始的二维码(不生成图片文件) h0 r4 @0 D9 U
- function scerweima2($url=''){
4 V4 I( D+ ] \8 P - require_once 'phpqrcode.php';
4 F+ q+ G- ?1 g D - $value = $url; //二维码内容( Y! N) S$ P! s; x0 y1 p/ M
- $errorCorrectionLevel = 'L'; //容错级别
# S- s r% j+ d0 c - $matrixPointSize = 5; //生成图片大小! B. G5 }4 H- K* T6 v
- //生成二维码图片
1 ]1 ]7 F" U) b ]# \& a - $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
% \8 I O+ \9 e, E9 f - }
/ Q! Q# a$ U r4 g5 `- a - //调用查看结果) k( i% X9 L$ ?% A
- scerweima2('https://www.baidu.com');
/ Q" Q3 U# j) o2 Y m5 I
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。; b3 g D( r. v; z
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
5 l+ a# w. ~: r4 |( t! C在线生成二维码工具(加强版)! D: d1 P3 d S' Z& H
http://tools.jb51.net/transcoding/jb51qrcode, o9 z* w6 i2 [6 q& W7 p5 q
在线二维码解码识别工具* Y" f! @ A2 I8 S: r3 I- d
http://tools.jb51.net/transcoding/trans_qrcode8 S3 g" g) F/ Q1 @! U
$ ^* ^$ O E: w: M% t" S. Z4 |2 `! n# s3 Y, p7 W6 s1 ~( t f2 Q8 ]
1 `% o( N- Q8 g0 S, b
5 u6 o2 l1 N7 S. }. ?! K
6 i3 D. ^+ N/ T9 b8 y |
|