cncml手绘网
标题:
PHP基于phpqrcode类生成二维码的方法详解
[打印本页]
作者:
admin
时间:
2020-7-20 21:02
标题:
PHP基于phpqrcode类生成二维码的方法详解
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
' i& T& t. H, b$ l/ B
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网
http://www.liantu.com/
的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
3 W- t* n5 _% ]+ V
前期准备:
: `1 u( Z; R- L
1.phpqrcode类文件下载,下载地址:
https://sourceforge.net/projects/phpqrcode/
7 V z3 k3 K" S, N
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
5 f- V; P3 U3 c% ~) H/ u
方法解读:
; f' R1 s. ]* j- v+ l( _
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
7 a) _- P9 x; M/ s, d
public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
9 g2 M V- C3 i5 C, N" W
{
5 P* o: H+ ~+ j0 K2 H/ F9 a; q
$enc = QRencode::factory($level, $size, $margin);
0 v6 Y' ~: a/ K8 J
return $enc->encodePNG($text, $outfile, $saveandprint=false);
8 a/ d% P4 m8 C: f/ _# o+ W
}
' N3 o' y6 @% R4 n" |: ^
复制代码
第1个参数
$text
:二维码包含的内容,可以是链接、文字、json字符串等等;
* X2 ?. Q- S' O$ k6 }# |, m
第2个参数
$outfile
:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
! |! @& I* f) D" Q, w0 f) Z8 k
第3个参数
$level
:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
1 O& ]$ P9 N2 |+ `/ r
第4个参数
$size
:控制生成图片的大小,默认为4;
+ ?* I0 Q/ Y# @" X8 d9 l7 J
第5个参数
$margin
:控制生成二维码的空白区域大小;
3 `( \. X) E% D% g4 m( g
第6个参数
$saveandprint
:保存二维码图片并显示出来,$outfile必须传递图片路径;
: O! P3 t$ G1 k% S9 ^
使用示例:
% d! C" D& A' f( p
1. 生成二维码(生成图片文件)
3 V1 |, i' M. W1 u; p o
// 1. 生成原始的二维码(生成图片文件)
8 }& ]* F2 V9 r7 k* Z4 A: @' y
function scerweima($url=''){
: I1 o8 W7 s5 g' F# d. K2 m
require_once 'phpqrcode.php';
$ B( R3 M/ B* r" r) K
$value = $url; //二维码内容
+ h6 d: Y) n2 }$ t
$errorCorrectionLevel = 'L'; //容错级别
9 y; w& X/ v3 W7 l8 G
$matrixPointSize = 5; //生成图片大小
2 J" n! x3 o) z/ _
//生成二维码图片
4 e2 Y4 w, T) f. c' h6 _% y
$filename = 'qrcode/'.microtime().'.png';
( G' A: s) S3 W O) N) f0 Z9 D
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
! g6 \- f) E3 s) a; \% ~" ?
$QR = $filename; //已经生成的原始二维码图片文件
% A( J- N2 S G B5 q8 z0 P) ?7 X
$QR = imagecreatefromstring(file_get_contents($QR));
: Q& x# a! l0 X# l
//输出图片
+ ?7 A3 b1 |& r8 q
imagepng($QR, 'qrcode.png');
9 J) N3 D6 D6 f3 o
imagedestroy($QR);
w3 l# U; s2 D; v" g
return '<img src="qrcode.png" alt="使用微信扫描支付">';
* c! n' q5 D5 e: g. a9 T
}
& R2 R3 T H, x1 U0 S
//调用查看结果
: k" r7 _. S4 i1 T v% ]0 \" \. O
echo scerweima('https://www.baidu.com');
- w) @; T% F* ~1 W, ]3 W
复制代码
2. 在生成的二维码中加上logo(生成图片文件)
+ R( h( u! Z+ ^4 s) X
//2. 在生成的二维码中加上logo(生成图片文件)
# G6 y7 v' G1 `" ^
function scerweima1($url=''){
! [6 a' B! ]+ U
require_once 'phpqrcode.php';
. Q, T% N7 G, }- Q
$value = $url; //二维码内容
8 c" |$ o1 E6 P/ |6 c2 R, e
$errorCorrectionLevel = 'H'; //容错级别
7 z5 `6 X" X. @- I$ J
$matrixPointSize = 6; //生成图片大小
7 Y; a" T8 P* L3 n& \9 f
//生成二维码图片
0 L0 \' c1 a* k. @) Y/ A. c
$filename = 'qrcode/'.microtime().'.png';
& x# L3 C7 Z. U/ z- _; N$ `9 B
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
2 Z* n! p" ^2 \# q( Z# Z) Z
$logo = 'qrcode/logo.jpg'; //准备好的logo图片
. K8 \% v4 L q2 i$ J2 |* O; S C
$QR = $filename; //已经生成的原始二维码图
/ @ T6 s" p, I( I0 b# o6 ?
if (file_exists($logo)) {
2 B- z. f, F/ t8 B$ ?
$QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
|! P5 K2 i" f6 s4 h' l z T
$logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
8 b1 ?$ {2 t6 }9 N7 `1 z; s/ u( [
$QR_width = imagesx($QR); //二维码图片宽度
' \" o3 u) d0 D& d: m. V, d# b
$QR_height = imagesy($QR); //二维码图片高度
" e/ v) |) m6 @3 a9 |% |
$logo_width = imagesx($logo); //logo图片宽度
5 s4 H6 }" l/ N6 m" C" a' H
$logo_height = imagesy($logo); //logo图片高度
) w; g: B2 f. _5 w. @
$logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
& a4 @( ^% q' Z& ^
$scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
+ w5 N$ z8 D! d u
$logo_qr_height = $logo_height/$scale; //组合之后logo的高度
3 J- |1 ?3 ^0 Z6 H* X, b
$from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点
8 X/ V$ f+ ]$ O. H
//重新组合图片并调整大小
9 x1 F- v+ L* W
/*
; m7 ~* ~ p9 ]8 `/ W# ?8 ]: Z6 ~
* imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
' ?2 |* z$ E- ~1 @7 Y
*/
& `0 m7 M/ b0 s4 p |
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
& |2 ?' b8 Z; s$ Q* O. h* v5 a' b% F! N
}
. _9 P) e# f# ?/ P2 I
//输出图片
) h3 L$ p9 O+ X
imagepng($QR, 'qrcode.png');
! x/ w% J( v% o* S8 N
imagedestroy($QR);
# B- \2 n4 P) j. ~6 _, ]) B
imagedestroy($logo);
( m8 f& O! b9 K4 {0 f! ]0 r5 n
return '<img src="qrcode.png" alt="使用微信扫描支付">';
8 R/ A- F* u$ n4 h. }; q/ |0 p
}
/ p* ~' R5 _, n8 P s9 Z
//调用查看结果
1 S/ l7 u% K+ f0 t" D G9 u X
echo scerweima1('https://www.baidu.com');
, e# Q& ?6 J( ?; a' @9 g0 i. e o
复制代码
3. 生成二维码(不生成图片文件)
" {* q3 H' I5 N! i3 |! h
//3. 生成原始的二维码(不生成图片文件)
! ~: w2 }3 z# E8 H! I% g/ [1 @
function scerweima2($url=''){
0 Z5 N0 L; {( ~
require_once 'phpqrcode.php';
a* f" Z9 W. d1 Y7 F, l$ O
$value = $url; //二维码内容
: }% g& e! E; g# Q2 L
$errorCorrectionLevel = 'L'; //容错级别
2 H6 i. P. b; o1 \ x D
$matrixPointSize = 5; //生成图片大小
M6 n. G1 L$ G/ a! d& s
//生成二维码图片
6 s; {5 B) g" R6 u% U' }3 u i" `
$QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
1 f, S, `# \$ n; M" a3 Y
}
/ |1 f n2 T3 O: }
//调用查看结果
! B& |0 s. I- k* l; q
scerweima2('https://www.baidu.com');
+ K& a. q9 K t9 t+ D2 J* k3 z
复制代码
前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
+ |$ T: \! O* p8 d, X% v
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
" ^+ W+ e3 Q, ]+ u0 B
在线生成二维码工具(加强版)
2 \$ V" p3 V$ E# W( T
http://tools.jb51.net/transcoding/jb51qrcode
7 ~ T( f: I$ i: S E1 q
在线二维码解码识别工具
* k' g7 |8 S) p# N
http://tools.jb51.net/transcoding/trans_qrcode
/ ]1 G, o- m9 k7 O* w
8 Y9 T6 _. {2 d9 o8 B' R
1 [- Y- I4 d% q* F
+ A. H% x f2 S$ m' j
: Z- }* x# u1 K- U6 F' e' U7 V3 g
4 P9 d+ i+ U$ C( B
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2