cncml手绘网
标题:
PHP基于phpqrcode类生成二维码的方法详解
[打印本页]
作者:
admin
时间:
2020-7-20 21:02
标题:
PHP基于phpqrcode类生成二维码的方法详解
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
2 T6 }2 F, F* C1 @9 p1 _; m u
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网
http://www.liantu.com/
的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
2 D: | r6 w2 r- s8 ?, f" ^
前期准备:
+ c+ k% O% l9 ~- O5 ^* |4 a. M
1.phpqrcode类文件下载,下载地址:
https://sourceforge.net/projects/phpqrcode/
" b0 N3 Y2 n) ^
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
# H! L D5 e# g5 E# i- q( i+ x; j1 t
方法解读:
4 z4 S5 r: `& M
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
# m2 u9 H- a) ]# }7 b" I/ Q+ P' F
public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
1 j; ?2 D, e9 `/ B# O
{
% i _- n& f7 n& e
$enc = QRencode::factory($level, $size, $margin);
8 L( L d# T! c
return $enc->encodePNG($text, $outfile, $saveandprint=false);
5 } F6 I' ?' {* [/ G/ k! q
}
! ]: J2 N2 Z5 O% j
复制代码
第1个参数
$text
:二维码包含的内容,可以是链接、文字、json字符串等等;
! p( ?. m. D3 ]# T1 g; m
第2个参数
$outfile
:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
5 t- R- i* B" ?" ^- Z7 D/ q
第3个参数
$level
:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
" H" W1 R8 o5 n- n/ X
第4个参数
$size
:控制生成图片的大小,默认为4;
t) {8 @. O! S" @9 `
第5个参数
$margin
:控制生成二维码的空白区域大小;
- @8 C( X* r& [
第6个参数
$saveandprint
:保存二维码图片并显示出来,$outfile必须传递图片路径;
, X2 S/ u5 x% Q' u3 J
使用示例:
: w4 X( x" v* }- Y) p6 c$ N" S( i3 b
1. 生成二维码(生成图片文件)
7 q; B2 F" P3 Q! `7 m+ A# r7 T
// 1. 生成原始的二维码(生成图片文件)
! D7 ]1 `1 g3 t
function scerweima($url=''){
/ x0 b* X0 z5 O9 O4 x( \# T2 @
require_once 'phpqrcode.php';
5 I, } [& |; ?1 m7 i
$value = $url; //二维码内容
5 L, J. e; b0 `# `8 \2 [
$errorCorrectionLevel = 'L'; //容错级别
% ]+ C! g N o1 s; T% E0 M
$matrixPointSize = 5; //生成图片大小
$ {! p, |/ G& J: p4 T
//生成二维码图片
. K' t( ^1 e0 P1 \4 c5 C7 d7 F% ]
$filename = 'qrcode/'.microtime().'.png';
6 }; |& K7 x; Q1 ~( z) F
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
9 J6 r) u v6 g8 {
$QR = $filename; //已经生成的原始二维码图片文件
) v5 L+ S% l# X2 Z* D2 T
$QR = imagecreatefromstring(file_get_contents($QR));
' W! a9 w; J0 \* [7 |" @
//输出图片
, W0 |# \8 G, K. ?
imagepng($QR, 'qrcode.png');
. E# _' F* k. ~! v1 b/ E: w/ z+ ]
imagedestroy($QR);
, X! {8 s* c Z9 c7 p& T0 Q
return '<img src="qrcode.png" alt="使用微信扫描支付">';
" k p, b. E* ?3 W" i, f2 D
}
0 _' p5 ]5 G% Q- U
//调用查看结果
/ d& ~5 W V! z; h: u5 {; A2 \
echo scerweima('https://www.baidu.com');
0 k! M, o2 T7 }) W) X6 ~. \4 _- g4 J- ]
复制代码
2. 在生成的二维码中加上logo(生成图片文件)
w2 Y0 W" B' r4 m9 `6 w
//2. 在生成的二维码中加上logo(生成图片文件)
8 ]& v3 L* ^. ]" D2 x
function scerweima1($url=''){
1 f8 d0 U" {7 T& ?
require_once 'phpqrcode.php';
/ r' |/ ? b+ Y1 I4 s0 f0 G
$value = $url; //二维码内容
# F! J5 x/ o. C- a5 q, R! r# M5 ^
$errorCorrectionLevel = 'H'; //容错级别
# X n5 c& d: a! P
$matrixPointSize = 6; //生成图片大小
. X% @1 l3 G3 B! O5 u [
//生成二维码图片
; ?% Z4 d! x4 y. }% g
$filename = 'qrcode/'.microtime().'.png';
# [: `) R. ^5 }% {3 J* F
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
, h8 q4 W2 @3 i/ @
$logo = 'qrcode/logo.jpg'; //准备好的logo图片
+ c2 [: c6 J1 N0 V2 ~. `
$QR = $filename; //已经生成的原始二维码图
, Y. y! r1 b( Q* S; u
if (file_exists($logo)) {
5 c4 m! @9 H# w: ~2 S
$QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
4 D; C$ v: T9 J+ @8 H' M O- K
$logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
: {% f5 l) f: g9 u& g/ J+ @
$QR_width = imagesx($QR); //二维码图片宽度
% C2 _5 B3 S9 a, b! v- Z
$QR_height = imagesy($QR); //二维码图片高度
% F7 g* M: q& o
$logo_width = imagesx($logo); //logo图片宽度
+ r3 k6 V# f$ c/ _
$logo_height = imagesy($logo); //logo图片高度
/ ~4 b3 d* l) Z8 D8 V
$logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
1 Z; W! b5 R' w$ ~) P9 z3 s
$scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
0 y) x6 \3 ?. J/ a/ D
$logo_qr_height = $logo_height/$scale; //组合之后logo的高度
2 l0 u1 V& K5 ~, _: t3 q9 P
$from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点
1 R4 m: _/ C# ~* v8 L% G/ m
//重新组合图片并调整大小
' }) O3 l( u3 T8 G9 Y0 H: H3 o
/*
& c" g4 X6 G" K. S( E5 z: X
* imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
. S1 I! [+ ]: `; |
*/
; a! e/ U1 L4 ?0 c# U* ^
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
1 [4 X3 f7 u/ o% _
}
/ I0 X! G) O* m
//输出图片
9 R& q. I% m" b7 ?. Y8 J# _
imagepng($QR, 'qrcode.png');
4 X4 L1 s" `- x
imagedestroy($QR);
^, x! i6 J- I6 m% o
imagedestroy($logo);
3 K3 r/ l* z% j& a# t
return '<img src="qrcode.png" alt="使用微信扫描支付">';
7 a j- J( I X6 E, Y' C
}
) F7 y; q( n1 }& }' D# j
//调用查看结果
0 E" K) [6 a# I$ M- p
echo scerweima1('https://www.baidu.com');
6 P: R+ B8 p w5 M1 P5 L/ R
复制代码
3. 生成二维码(不生成图片文件)
, I3 X" d. T5 B/ s3 {
//3. 生成原始的二维码(不生成图片文件)
2 c0 k9 t2 R) K4 F1 z8 Y# T
function scerweima2($url=''){
" s3 D( d! _$ a5 s' _
require_once 'phpqrcode.php';
, l H2 l& d6 I$ b
$value = $url; //二维码内容
" ]5 E; N$ a7 [. x* g% ]/ S
$errorCorrectionLevel = 'L'; //容错级别
; n$ _5 l* y. Y/ @8 Z
$matrixPointSize = 5; //生成图片大小
, v& T" d3 X* y( i0 A
//生成二维码图片
% B& Z5 _ { s; Z' m: t: j6 s
$QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
; n0 x* s1 d) p* h1 P) O; [
}
4 L; ]# ~0 ^; v5 x
//调用查看结果
) }9 |9 Z5 `) D+ P) c8 s
scerweima2('https://www.baidu.com');
& y0 E! @ i7 [$ j3 X) C, }& d2 m
复制代码
前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
0 `+ G$ d5 b' ]* u1 K; v) H
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
" h+ Y8 u. u* `
在线生成二维码工具(加强版)
. s( p1 r3 X% B9 m m
http://tools.jb51.net/transcoding/jb51qrcode
% l* v; V/ _5 R- ?/ W" |/ N5 ~
在线二维码解码识别工具
/ m: I3 m. T& F8 l& j
http://tools.jb51.net/transcoding/trans_qrcode
0 c% |6 P9 k% F! D/ o
, _& l8 `' Z8 v4 E9 H
' l. K; \2 K( H
" L2 {, ~, k/ ?7 U4 Z
! W% P" m, X* f* k* C; z+ ~! N
/ o/ D& P- t" d& T
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2