cncml手绘网
标题:
PHP基于phpqrcode类生成二维码的方法详解
[打印本页]
作者:
admin
时间:
2020-7-20 21:02
标题:
PHP基于phpqrcode类生成二维码的方法详解
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
0 I) x* n8 n! L+ F3 t& I
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网
http://www.liantu.com/
的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
$ h2 }. `5 d: Y7 E# Y0 \( z
前期准备:
# W+ Z. a+ {+ Y, |1 v. Y
1.phpqrcode类文件下载,下载地址:
https://sourceforge.net/projects/phpqrcode/
: O/ b; N C" ]# [
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
/ f! R9 {( i% O2 K
方法解读:
" X3 r7 Q5 P5 y7 I" e1 E- _
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
2 p& ` t9 A* P2 n# d- E' B; H M1 \' ^
public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
0 N5 I- L+ y' ]9 L- i9 |. Q
{
7 h4 [. o8 |2 m* x( H* h
$enc = QRencode::factory($level, $size, $margin);
3 Z& e) f+ n: ~6 `* \" e# u3 Y& W
return $enc->encodePNG($text, $outfile, $saveandprint=false);
7 ]! ^0 F% j/ c; `! @/ \# ?
}
' q2 Y0 M1 R* q1 ~$ B4 {, w
复制代码
第1个参数
$text
:二维码包含的内容,可以是链接、文字、json字符串等等;
[; x5 z% B' G/ E6 [+ Z7 f2 h6 F7 `
第2个参数
$outfile
:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
% y2 G U! G9 L9 ~$ n
第3个参数
$level
:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
) [0 {1 w# q7 h+ n+ V
第4个参数
$size
:控制生成图片的大小,默认为4;
/ N& k4 O ~1 F+ y; @( F/ R6 O
第5个参数
$margin
:控制生成二维码的空白区域大小;
; V, y5 s5 N9 z* x
第6个参数
$saveandprint
:保存二维码图片并显示出来,$outfile必须传递图片路径;
6 ]4 _# K! D3 l" T4 _# V2 c
使用示例:
$ A& A: V/ H& Y3 R3 a% U6 y
1. 生成二维码(生成图片文件)
6 K) R2 _9 ?. o, \) K$ B( C
// 1. 生成原始的二维码(生成图片文件)
: G5 t# L5 Y( U/ ]# I( ?' x
function scerweima($url=''){
! _ t0 n t* s# v7 O {( L0 ^) d. e
require_once 'phpqrcode.php';
3 g5 o& i( h+ e* I5 X% W/ }
$value = $url; //二维码内容
4 U1 L) q& N8 k8 f u9 t
$errorCorrectionLevel = 'L'; //容错级别
" z/ ~$ o. C7 L6 P( ^3 _% P
$matrixPointSize = 5; //生成图片大小
r% P9 T. |& |7 O5 ^8 \* u: Q3 m
//生成二维码图片
- h+ K& f* b! Q* u% S# x
$filename = 'qrcode/'.microtime().'.png';
; H- j' M" _& @% T8 g- C! |8 q
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
: X) c4 M+ C" Q. G- F# o
$QR = $filename; //已经生成的原始二维码图片文件
5 V. }' W4 H+ E3 @9 [; p; E! P
$QR = imagecreatefromstring(file_get_contents($QR));
1 n& N6 `. m3 Q% ?
//输出图片
0 G% Q- K$ I' C
imagepng($QR, 'qrcode.png');
" U x: s1 R- r9 p& p$ H
imagedestroy($QR);
" ^0 e$ d" l8 A) O& h4 v
return '<img src="qrcode.png" alt="使用微信扫描支付">';
4 l6 s0 g( m% ?9 M3 ^
}
+ W* W8 P* X% k: [' \! }3 v
//调用查看结果
. ?8 A5 r) N. C& x! g
echo scerweima('https://www.baidu.com');
+ r, n, h0 {8 D0 M( |5 S% W6 r/ u% _
复制代码
2. 在生成的二维码中加上logo(生成图片文件)
8 L% p' {, M, D+ K* Z: C* M0 f/ |1 ~5 J
//2. 在生成的二维码中加上logo(生成图片文件)
O1 i* p( Y* [; z/ Y( J
function scerweima1($url=''){
9 F w4 J! F" r7 V1 J+ C
require_once 'phpqrcode.php';
; ~* E3 L. u8 ^& G( P
$value = $url; //二维码内容
3 `: C, g% T% l0 n8 s* Y( i+ p
$errorCorrectionLevel = 'H'; //容错级别
7 R% U. x% M9 L9 f2 _" f5 _6 }/ m
$matrixPointSize = 6; //生成图片大小
$ T9 ]( l0 a: j* i( t% [$ N3 Y
//生成二维码图片
/ ]+ o2 o: {2 V7 t, \) [$ x! G
$filename = 'qrcode/'.microtime().'.png';
( [$ Z' n: T0 Q6 J) ^7 `, P
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
1 X4 T* r. U( H; N" M$ J& @3 T8 y2 x1 m
$logo = 'qrcode/logo.jpg'; //准备好的logo图片
1 a) H5 l0 \' ?- p( P) S
$QR = $filename; //已经生成的原始二维码图
5 S0 v6 B" Y! R; F0 o' d+ z
if (file_exists($logo)) {
0 j p* T3 Q( s( j- h- Y& a
$QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
N( r( y1 {( Y# ~( ]5 \
$logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
8 a' Z; N6 z9 B! P D
$QR_width = imagesx($QR); //二维码图片宽度
4 k9 N" m5 f* A8 \0 l
$QR_height = imagesy($QR); //二维码图片高度
V7 C! Z2 v( A
$logo_width = imagesx($logo); //logo图片宽度
/ Y5 i2 }( ?% D
$logo_height = imagesy($logo); //logo图片高度
6 d# \( D* F* s- g
$logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
+ m) ]- y7 ~) `; U
$scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
- a# Q+ y2 z! j5 \# g/ r7 M
$logo_qr_height = $logo_height/$scale; //组合之后logo的高度
+ c( ?6 e1 ^# M! w- P$ C2 t/ @
$from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点
: Z+ s, l. ^, f& k$ y7 g6 {$ }1 U
//重新组合图片并调整大小
4 j$ [4 |+ b- z; w. |
/*
0 K N6 U& I* y. H
* imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
n3 J% w; _) i1 D1 L
*/
3 y" O# F w9 c
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
: _, s* k! R2 j
}
, n* Z! ]" U" H& z7 i) e8 s9 s
//输出图片
! o/ b# k! H3 \8 I
imagepng($QR, 'qrcode.png');
! Z3 [! Z$ U1 A1 j& ~7 ?% c
imagedestroy($QR);
- U9 S# C* U! _9 V
imagedestroy($logo);
/ B/ b2 D4 _+ `4 X* _
return '<img src="qrcode.png" alt="使用微信扫描支付">';
( a$ [6 K O k1 F& i" L* O; u- p" I* ]
}
# q: r% a% i$ q! H3 E" m/ V2 p
//调用查看结果
0 r& M$ W, y6 S/ o3 Z5 D
echo scerweima1('https://www.baidu.com');
$ j1 S6 E- j* l* j
复制代码
3. 生成二维码(不生成图片文件)
9 R6 O% q9 n, f# ~& f1 I
//3. 生成原始的二维码(不生成图片文件)
0 W8 m( y; L9 ?. G4 V
function scerweima2($url=''){
" c3 X" b! p. k+ i( {
require_once 'phpqrcode.php';
, q, c1 H, j i5 B8 r& Q
$value = $url; //二维码内容
: R: O1 q! Q9 D+ ?
$errorCorrectionLevel = 'L'; //容错级别
9 a1 G/ q. x0 ]- R
$matrixPointSize = 5; //生成图片大小
* H7 R, }. P& ]3 [
//生成二维码图片
3 O' @& S6 ~/ _& ~4 F* i
$QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
7 [' f4 G! U/ L$ j2 ^4 x
}
3 r2 w( b8 H/ w# ]$ \
//调用查看结果
* C, g( W4 Q3 P; M6 H4 ]# O$ K
scerweima2('https://www.baidu.com');
6 t4 i2 I. h$ _' A' ^
复制代码
前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
2 o& G% m/ n2 E# v
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
' ~1 `& J' ]. V' T! z
在线生成二维码工具(加强版)
. a$ b) ~: K7 L( h
http://tools.jb51.net/transcoding/jb51qrcode
/ o8 d- I; `& K% y9 b9 t( S8 _
在线二维码解码识别工具
2 r7 L8 \1 p" p& u
http://tools.jb51.net/transcoding/trans_qrcode
* ]+ g4 R& q# G( Q& g3 m. K
) P; Q2 A8 n$ q' H' G5 k2 }6 ?
8 `, V6 R& W# ] m: W) X- |
! ~7 c& _2 Y9 A9 D1 v2 E' Q
`( X( f! ?* p% E" H% h
* G7 I7 N2 s/ V. P
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2