cncml手绘网
标题:
PHP基于phpqrcode类生成二维码的方法详解
[打印本页]
作者:
admin
时间:
2020-7-20 21:02
标题:
PHP基于phpqrcode类生成二维码的方法详解
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
7 d" u. W# P3 g h7 H" `
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网
http://www.liantu.com/
的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
$ C, ^4 H8 _& s+ p: Y/ R* V
前期准备:
& ^( b! N7 O" y
1.phpqrcode类文件下载,下载地址:
https://sourceforge.net/projects/phpqrcode/
' l4 A# _ l$ g( K' Z0 G
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
5 n8 H4 A5 n. p* B5 K Z. O
方法解读:
+ S$ C& t) x& h5 T: K Z& n
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
% L, ]/ [; v# I% X |- J
public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
% d1 p7 `" o8 d2 H, E& H: H
{
& b4 f! w% |$ O1 H5 P8 g
$enc = QRencode::factory($level, $size, $margin);
: C1 h/ K6 ^/ R% p
return $enc->encodePNG($text, $outfile, $saveandprint=false);
0 _# o b5 i) N$ ^
}
) n; S5 b& V7 S( k9 \3 Q
复制代码
第1个参数
$text
:二维码包含的内容,可以是链接、文字、json字符串等等;
G' F% W$ y' v1 W
第2个参数
$outfile
:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
* H I3 J; y& x3 T* S1 O ^
第3个参数
$level
:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
5 V- ` }5 B! b" M A
第4个参数
$size
:控制生成图片的大小,默认为4;
% K$ ~* A* @: U7 Q$ z: n8 b2 {9 C: l
第5个参数
$margin
:控制生成二维码的空白区域大小;
! u( _5 K3 N' X9 @
第6个参数
$saveandprint
:保存二维码图片并显示出来,$outfile必须传递图片路径;
# I0 H. H C: N
使用示例:
4 m' y& t: P# L8 K7 \$ U" `& I- ?
1. 生成二维码(生成图片文件)
! F6 J" I+ h* a
// 1. 生成原始的二维码(生成图片文件)
; Y1 z: R1 j$ p) ~& ?, a; C9 n8 _
function scerweima($url=''){
1 n/ g4 g- |# o; L- }
require_once 'phpqrcode.php';
9 j( w+ d7 F; t3 ~0 K9 [
$value = $url; //二维码内容
' x; v0 h' _2 a4 U5 d/ y9 F* y
$errorCorrectionLevel = 'L'; //容错级别
7 x [1 [: Z) K
$matrixPointSize = 5; //生成图片大小
7 b+ _+ ^+ ?8 [8 I& v- @2 a
//生成二维码图片
. z* t7 o! h. h& P& D
$filename = 'qrcode/'.microtime().'.png';
+ y% o. t9 {" r
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
0 K0 ^( S1 p/ f' Q K1 F; h
$QR = $filename; //已经生成的原始二维码图片文件
, C4 T8 x& f+ Z: E: g8 o4 f
$QR = imagecreatefromstring(file_get_contents($QR));
& B* r* ? @& K" j$ l# r) |
//输出图片
5 u1 j2 {0 S. I6 Y# W. V
imagepng($QR, 'qrcode.png');
2 _; V1 W8 ~8 J% Z) m g/ v N1 d
imagedestroy($QR);
& L \+ {3 h/ b6 b$ a
return '<img src="qrcode.png" alt="使用微信扫描支付">';
. U- N7 T) I: M! h [
}
+ ~4 a7 z$ T) G4 f" p
//调用查看结果
# m% K1 _: R8 Y Y( [( }2 q
echo scerweima('https://www.baidu.com');
2 H ^/ _4 Q+ q# x
复制代码
2. 在生成的二维码中加上logo(生成图片文件)
& c5 C3 @, h h
//2. 在生成的二维码中加上logo(生成图片文件)
' @2 n+ a4 W3 p- [; ?7 z# w
function scerweima1($url=''){
3 m# m2 `! f1 V3 ]
require_once 'phpqrcode.php';
6 I9 u$ b" h6 C% G. t1 d
$value = $url; //二维码内容
0 @! w2 w9 N; k7 e6 w
$errorCorrectionLevel = 'H'; //容错级别
" ^( Z6 s. ?; V) N1 R4 O, d& X
$matrixPointSize = 6; //生成图片大小
9 y6 j" u3 b& _' @4 g
//生成二维码图片
" B( a% L( _4 y P3 a
$filename = 'qrcode/'.microtime().'.png';
( p# U- y/ P. L* P: i
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
7 @ q- p0 u" P/ X0 M$ d( h
$logo = 'qrcode/logo.jpg'; //准备好的logo图片
4 @* G& S) S$ e6 N+ K' M
$QR = $filename; //已经生成的原始二维码图
9 z) W s# p0 D3 }! R0 K& w- W
if (file_exists($logo)) {
* l' F7 j, v* I5 R* Z
$QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
: j- \" Y0 m! W. V$ t/ X# W# E
$logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
1 W, u$ i5 l7 u! O3 E/ W
$QR_width = imagesx($QR); //二维码图片宽度
/ Y! V, U- ?7 A1 D
$QR_height = imagesy($QR); //二维码图片高度
8 [0 T. q7 \% [
$logo_width = imagesx($logo); //logo图片宽度
+ F9 F8 z2 s3 f& @
$logo_height = imagesy($logo); //logo图片高度
8 V5 }+ |: V( C$ R
$logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
1 J7 o8 x7 J3 B) u
$scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
" m. M$ _8 q$ `% V9 `
$logo_qr_height = $logo_height/$scale; //组合之后logo的高度
6 d+ n/ U" K) U' S8 P z& E$ ^( e
$from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点
7 Y. A& s! r. s+ X- c! p$ V
//重新组合图片并调整大小
7 W: c, x7 \8 C* h' p
/*
& b/ h* ~4 C$ ~) r1 Q
* imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
$ y& s1 p7 e5 a/ Q( j* ?; y
*/
- M# ^; F! V' m1 l5 r" B" z7 o
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
, t5 _1 E5 H# L
}
9 a4 |' R4 b0 q- X
//输出图片
2 d' C6 R* V% J: ~: m! d1 d
imagepng($QR, 'qrcode.png');
7 J& D% Z. y* I! i, P+ R
imagedestroy($QR);
6 o7 e2 u# u# X' ^! T
imagedestroy($logo);
, J. v7 \ j8 y9 W6 g
return '<img src="qrcode.png" alt="使用微信扫描支付">';
S# ^4 o3 x3 K1 u# g
}
& @3 h# q8 }; O B) d1 @
//调用查看结果
, |; u+ [! F4 I- U0 E+ j
echo scerweima1('https://www.baidu.com');
* g' m6 Z+ N6 `3 @$ S6 C
复制代码
3. 生成二维码(不生成图片文件)
Q2 O+ X/ |% A7 T2 h6 F
//3. 生成原始的二维码(不生成图片文件)
3 C6 v2 G8 Q1 w1 t2 l0 D, V
function scerweima2($url=''){
' }' `9 y- w1 p$ g
require_once 'phpqrcode.php';
/ @- P T7 G4 {- t4 v
$value = $url; //二维码内容
, E1 z0 ^. W1 Z0 h
$errorCorrectionLevel = 'L'; //容错级别
9 Y7 `4 R" S: Z5 n: z
$matrixPointSize = 5; //生成图片大小
+ U! S! p4 \* a
//生成二维码图片
1 s! b: ]; y/ x! c
$QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
G1 Z$ N* L" {2 k* T& k
}
0 t! ]0 v3 p# S: R. t% |
//调用查看结果
$ K( j4 p( n8 Y; x- a8 ~2 T1 O
scerweima2('https://www.baidu.com');
& k7 n [1 ?5 m2 F% N
复制代码
前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
, k* H! t' v3 B: g% c
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
* }, w4 C! \5 K
在线生成二维码工具(加强版)
/ T# B4 ]: { ^" _
http://tools.jb51.net/transcoding/jb51qrcode
v C$ H0 N' i( O* J {6 ~" _! W
在线二维码解码识别工具
* M' K7 {! G* I( [3 y; r
http://tools.jb51.net/transcoding/trans_qrcode
0 R2 g' Y4 Y4 W6 J- V" u+ P
; s$ @/ K n/ s1 e0 c
) t9 F! c1 z9 N+ _" e# g: J+ H
+ H4 Z! x5 N& x G1 R4 t$ |/ [, H
) X' w* z6 K5 |+ n1 O4 F; M
2 K: q9 U5 s! V5 G0 ]3 n3 l
欢迎光临 cncml手绘网 (http://www.cncml.com/)
Powered by Discuz! X3.2