管理员
   
论坛积分
分
威望 点
贡献值 个
金币 枚
|
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
9 q4 R1 k& H+ n$ _4 ^3 L8 c使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
$ n" m( {( \+ D5 f: E前期准备:) z7 z' ~% Z3 l
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/
1 \, W9 ^! M6 }( s4 r& G+ H H 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
7 |1 E% M) l/ Z方法解读:3 s( {; {! `1 P; v
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
* i- j; ?' _, m- g4 f" U- public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
6 }6 |$ R. P5 q; n/ W- c2 K( D - {
4 o3 E, K2 e( T - $enc = QRencode::factory($level, $size, $margin);% g1 Y6 u7 p5 k
- return $enc->encodePNG($text, $outfile, $saveandprint=false);, q2 i9 d5 W. z# I) F( g* x p
- }
- j% q* Q6 \ a; V8 y0 P/ q: A4 t
复制代码 第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;1 }6 e; _* `, a7 U
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
2 k( B2 [+ E. k/ m 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
$ B& k( H q- [7 z, I 第4个参数$size:控制生成图片的大小,默认为4;
5 a% F. n& t% J+ W4 f F0 U H/ I; i 第5个参数$margin:控制生成二维码的空白区域大小;
( F" h7 T- z( X- Y; h+ [6 c 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
& g% O1 {+ }0 p. e* h! x: ^: j使用示例:: }: H/ @0 u2 c* z* C1 W
1. 生成二维码(生成图片文件)8 i5 g7 W0 W3 Z3 M+ B4 E
- // 1. 生成原始的二维码(生成图片文件)
1 G2 k8 B* `* E5 h9 @$ X - function scerweima($url=''){) \9 t) n- h1 B3 J, N* K
- require_once 'phpqrcode.php';' d# W4 ?6 ?7 }8 [$ v8 T5 R" Y
- $value = $url; //二维码内容
$ ~1 e5 d. _. @# ~ }) y: s m" A - $errorCorrectionLevel = 'L'; //容错级别
7 p+ W% v* Y `+ h* O: n: C, U - $matrixPointSize = 5; //生成图片大小- z5 n' o! S1 I
- //生成二维码图片3 C% @5 `+ o) A! U! D3 V
- $filename = 'qrcode/'.microtime().'.png';
( D7 j1 y! ^4 R8 N0 |; Y# M - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
3 r+ J' @, Q. y& F8 L g - $QR = $filename; //已经生成的原始二维码图片文件3 {8 @) g4 t' e
- $QR = imagecreatefromstring(file_get_contents($QR));
; {: l1 z+ v/ [+ v$ q0 I& ` - //输出图片- `* x( b. ?# o- T
- imagepng($QR, 'qrcode.png');
, X5 i; F7 r! R' p - imagedestroy($QR);& \ Q+ o0 {6 w
- return '<img src="qrcode.png" alt="使用微信扫描支付">';7 O1 B( f7 o7 B& I$ u/ o* g
- }
) z- I- s" W4 T8 b3 D$ k" l; ` - //调用查看结果
. V. k+ i, i4 t: |6 R5 | - echo scerweima('https://www.baidu.com');3 X- O# _! r) E9 |6 ]
复制代码 2. 在生成的二维码中加上logo(生成图片文件)! m, z5 l; y: j M
- //2. 在生成的二维码中加上logo(生成图片文件)0 y) d, Q9 ~. u. I' \+ I
- function scerweima1($url=''){. v k8 r6 z: V) h
- require_once 'phpqrcode.php';
2 A( h) C# {5 [% c# x - $value = $url; //二维码内容
- o% l8 ]. B' W" X2 _# d" _ - $errorCorrectionLevel = 'H'; //容错级别
- \! W/ ~+ Q& S5 `" ?, U, m2 D - $matrixPointSize = 6; //生成图片大小
% [, T3 |8 P& [. W. W4 e" p! ? - //生成二维码图片1 ~0 X/ s; C# n; m+ f$ _
- $filename = 'qrcode/'.microtime().'.png';
" h; j) @& Z1 ~$ H' \5 P - QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);( Y4 y1 `4 Y* m6 @2 |9 [ t
- $logo = 'qrcode/logo.jpg'; //准备好的logo图片
& e- ^6 T {6 Q - $QR = $filename; //已经生成的原始二维码图9 X5 y- V# q( {1 A7 M# ~( b- X" W' E
- if (file_exists($logo)) {
3 j% D: J* U0 T' n - $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。0 B+ ~! f% f- i0 f& M+ K
- $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。3 }& p/ z$ M6 z+ s- Y7 g. ~
- $QR_width = imagesx($QR); //二维码图片宽度
. w1 m3 R% K& W- z# F: X- N5 I - $QR_height = imagesy($QR); //二维码图片高度
$ d Y* q9 o5 t - $logo_width = imagesx($logo); //logo图片宽度
) R; G; m t F' H3 i4 t- g. a - $logo_height = imagesy($logo); //logo图片高度. V9 n7 f- s% F- O3 D
- $logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
6 E1 T0 e) T, \( S - $scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)4 t& r/ Z2 g3 p" `
- $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
y& j; e/ r& r V" d* n - $from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点. x* H) i* o( X# c* I4 B8 I
- //重新组合图片并调整大小/ B" B/ a( R/ U$ x M; O* S$ Z
- /*
$ ^. @* @' j5 \; q6 z6 g - * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
6 E! n E8 y: k( u, w8 `7 v: J - */$ D1 r$ R. R# H: q. O" _8 @. h) t
- imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);. Y% F8 A- P, R: n' Y5 y/ T
- }
* V3 [* G1 @* h) i - //输出图片4 {& j5 Y' A3 W: n1 u$ ^8 N
- imagepng($QR, 'qrcode.png');6 |3 ?% C1 v" X7 f$ `0 M! c
- imagedestroy($QR);
6 k5 c9 y! Y: `; b" `2 G5 { - imagedestroy($logo);9 I, i0 B: q# s/ j( H5 I5 _! k7 x
- return '<img src="qrcode.png" alt="使用微信扫描支付">';
1 R+ W# f( w2 |" a6 r# b - }2 ~" A: m) R. w/ {
- //调用查看结果
6 V% o) L; Q# P - echo scerweima1('https://www.baidu.com');% w2 E3 o2 w; e1 W! c/ d- I( \- H# D
复制代码 3. 生成二维码(不生成图片文件)8 b% L6 r5 s8 \; m
- //3. 生成原始的二维码(不生成图片文件)
; P% @2 d. R2 Y4 T G# C" Q: ]. P - function scerweima2($url=''){
' m0 M0 {0 x+ `& \0 G% r - require_once 'phpqrcode.php';! y0 x4 m: \# G7 M
- $value = $url; //二维码内容
# }2 F j# R5 K" k {- e - $errorCorrectionLevel = 'L'; //容错级别
' w6 C" Z8 W1 ]: X) k) N7 e* m! f! Q - $matrixPointSize = 5; //生成图片大小% n1 x3 ]8 n" H% P5 I
- //生成二维码图片
3 T- K# Y* M" e, y2 x' A - $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);$ `& C1 Y- h ^$ N- d6 N5 A6 W
- }
' E0 `/ l7 u! Z9 R1 |! S7 B - //调用查看结果
% L9 I- m% C( R( ^% d4 F$ z - scerweima2('https://www.baidu.com');8 z$ G% o; R' w0 ^, o# A6 x9 L' r
复制代码 前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
9 C, l7 v5 v. A @3 r aPS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
/ |8 }6 d) F: t& ?在线生成二维码工具(加强版)
g# @/ X* W( I5 H) Q# uhttp://tools.jb51.net/transcoding/jb51qrcode$ |+ g( ?- }/ G) f f" P' Z- a
在线二维码解码识别工具
. K1 p' n7 V1 l' y- Mhttp://tools.jb51.net/transcoding/trans_qrcode
. M' d7 Y$ \( t9 |0 X) R! D7 G1 A3 |1 ?- _5 o$ \# r
! |4 H9 E( z- J# L' O1 L- @
) q# @. A$ [1 M
4 l4 \7 n* T$ _* ~) T
; H$ Q( V; L1 \* u4 l+ V |
|