cncml手绘网
标题:
PHP基于phpqrcode类生成二维码的方法详解
[打印本页]
作者:
admin
时间:
2020-7-20 21:02
标题:
PHP基于phpqrcode类生成二维码的方法详解
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
: p2 Q4 _; D. M* C @! t
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网
http://www.liantu.com/
的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
0 l" W% k( ?5 I% l' A5 B `4 k
前期准备:
! u0 W# \% }. g: w1 A* t9 C
1.phpqrcode类文件下载,下载地址:
https://sourceforge.net/projects/phpqrcode/
& L& [, j" _4 C7 m9 n5 U9 D
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
0 u Q6 t/ ]( g, w# S' I
方法解读:
" t" I- f3 p/ i* i; s0 i9 _* J" s
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
6 x. ]2 W& L3 x2 L: i, u
public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)
) k0 B; o, Z3 q5 m. R/ t
{
$ C% }1 v$ z: m6 ?& u3 y2 W
$enc = QRencode::factory($level, $size, $margin);
8 p6 \2 s% x v3 }* X
return $enc->encodePNG($text, $outfile, $saveandprint=false);
% N5 ^$ r4 n5 j; J" D$ j! c
}
8 w4 ~5 E+ b$ C9 `* [
复制代码
第1个参数
$text
:二维码包含的内容,可以是链接、文字、json字符串等等;
8 K$ ^$ E) r# M8 T
第2个参数
$outfile
:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
+ ?% K$ k/ [ s1 F3 Z* a/ G- O2 ^
第3个参数
$level
:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
) A6 B+ [" ]; W& Z6 C8 y$ J
第4个参数
$size
:控制生成图片的大小,默认为4;
0 }2 r7 I1 q3 J, K" ?7 F
第5个参数
$margin
:控制生成二维码的空白区域大小;
* C% D' H5 }0 I) Q# o
第6个参数
$saveandprint
:保存二维码图片并显示出来,$outfile必须传递图片路径;
* T1 o6 `' `/ H% A. \: x
使用示例:
( d" {0 q K2 v7 {4 M) h
1. 生成二维码(生成图片文件)
. B) `& e- X" W( Q* K/ ?: Y
// 1. 生成原始的二维码(生成图片文件)
/ ]6 @$ @/ d8 Q! P* R1 F
function scerweima($url=''){
. d2 _0 k1 T2 v1 T2 v
require_once 'phpqrcode.php';
; @+ H& Z7 ^. n8 D; J# [
$value = $url; //二维码内容
4 y' _( |5 \; m
$errorCorrectionLevel = 'L'; //容错级别
0 Z, w/ z! d% |6 ~1 F
$matrixPointSize = 5; //生成图片大小
' k7 h6 U4 H2 e1 c, B
//生成二维码图片
& q% T( f( {) ^0 N" j& u" p, W6 r
$filename = 'qrcode/'.microtime().'.png';
; Q' |/ W' H g9 n9 v7 K; N
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
2 {$ R! @5 i3 l2 {" _- ~
$QR = $filename; //已经生成的原始二维码图片文件
3 o+ C: G3 Z' Q( A2 [
$QR = imagecreatefromstring(file_get_contents($QR));
+ l6 O2 R" h. R$ P) a: ?
//输出图片
3 Z( f/ F7 g5 X$ t* e# w, j) |$ H6 G- H
imagepng($QR, 'qrcode.png');
$ o' M( v2 C+ D& S: v9 L3 B# q7 I0 Q
imagedestroy($QR);
$ D' p/ r4 V" \, H2 Y1 R
return '<img src="qrcode.png" alt="使用微信扫描支付">';
- R3 m4 x% S+ h+ Y/ S$ @3 ?% z" Q
}
8 t3 \% T9 g# _
//调用查看结果
9 Z+ O" ~% J. c& A
echo scerweima('https://www.baidu.com');
' H# l2 _# m- X" H; P
复制代码
2. 在生成的二维码中加上logo(生成图片文件)
Y7 h" H/ n) y1 N% h0 q- c
//2. 在生成的二维码中加上logo(生成图片文件)
: N# {* |5 h. z M7 M7 \9 }
function scerweima1($url=''){
# u" Q8 h; U" p4 l* I9 I! }
require_once 'phpqrcode.php';
- I' a% Q; t8 D1 G# R1 |6 F+ b
$value = $url; //二维码内容
; c3 O( P- z0 q0 k' T- ^$ F
$errorCorrectionLevel = 'H'; //容错级别
; m8 K) y3 ?- @3 S
$matrixPointSize = 6; //生成图片大小
, J6 n! @" n% K! z, |
//生成二维码图片
0 k6 a7 ` c& o, g2 \* Q0 c
$filename = 'qrcode/'.microtime().'.png';
0 J* h2 L+ k& B4 q! O4 r9 h9 [3 J
QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
. K8 K# f5 W+ D2 I
$logo = 'qrcode/logo.jpg'; //准备好的logo图片
# V9 w6 y, q8 r s
$QR = $filename; //已经生成的原始二维码图
( q6 `- |( O b! S* P- V
if (file_exists($logo)) {
4 h/ E R1 @# |6 I
$QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
, S3 e& x8 V! w7 B4 D% N" ?( n: h+ H
$logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
8 o- Q4 c7 O! |( v1 b
$QR_width = imagesx($QR); //二维码图片宽度
9 E, x8 `9 ?4 O8 C3 ~
$QR_height = imagesy($QR); //二维码图片高度
2 |8 x, X9 }. c0 u; P
$logo_width = imagesx($logo); //logo图片宽度
9 [7 x+ u5 F1 L+ s( m9 E* t/ ?6 R
$logo_height = imagesy($logo); //logo图片高度
1 r6 @. @/ [; ~$ V2 P
$logo_qr_width = $QR_width / 4; //组合之后logo的宽度(占二维码的1/5)
0 D) i3 a" f9 R) \! P" F
$scale = $logo_width/$logo_qr_width; //logo的宽度缩放比(本身宽度/组合后的宽度)
8 [' t& b" Q; a% X! [
$logo_qr_height = $logo_height/$scale; //组合之后logo的高度
0 l! l% y% Z6 V5 f7 J$ k
$from_width = ($QR_width - $logo_qr_width) / 2; //组合之后logo左上角所在坐标点
3 H4 O3 o( a$ n7 f/ |6 Z) C
//重新组合图片并调整大小
% {/ z( J& x# B% M; K/ F9 O
/*
5 ]. s7 m) F8 q1 g- h
* imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
4 E+ P' D5 A1 v# u! H# |) ^
*/
) b: x6 L: x; ]4 |- C
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
2 b- W2 [) P, B5 C% z7 \, E4 g
}
1 `- r) A7 ^ g+ t, J. u! a
//输出图片
- _ a/ C1 `: f& C" V' C
imagepng($QR, 'qrcode.png');
8 a! o( Z7 B+ k* ]; t1 H
imagedestroy($QR);
' d1 d8 J% G4 ]9 p D
imagedestroy($logo);
/ |6 W2 L9 w6 {( v T. _
return '<img src="qrcode.png" alt="使用微信扫描支付">';
+ ~* v9 t5 E5 a/ v# d; C! @
}
n! {/ i1 H) L9 I8 P6 Z
//调用查看结果
. m" r" G0 C- n" T. a0 R
echo scerweima1('https://www.baidu.com');
5 O+ S- j% r( W
复制代码
3. 生成二维码(不生成图片文件)
, I% f/ W9 B2 _% x# j6 `
//3. 生成原始的二维码(不生成图片文件)
2 {& j: n H$ J! q6 m$ X, ]
function scerweima2($url=''){
! Y7 R1 X* t0 b7 y/ [, R
require_once 'phpqrcode.php';
$ \4 a. }: {& Y, \8 j# S8 E! \! d
$value = $url; //二维码内容
* O# O" l N, q) \
$errorCorrectionLevel = 'L'; //容错级别
2 w1 x. r1 _$ H/ Y* c
$matrixPointSize = 5; //生成图片大小
- S) |+ M0 ]+ n* Y( b0 _ Z
//生成二维码图片
0 K' X5 Q5 F7 ]* G
$QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
" s% M q5 R! z( [$ F; x& _ w
}
1 x D* [$ t- J8 J
//调用查看结果
) p1 S/ ^% l; ^1 Q9 C1 V6 e
scerweima2('https://www.baidu.com');
! Q8 Y- [, S u, b6 t; o
复制代码
前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
) q$ x# }# T, T% a! [) C3 V3 Y9 c
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
, {4 o6 M2 T7 n w* x
在线生成二维码工具(加强版)
' H- _& H5 L. f% v
http://tools.jb51.net/transcoding/jb51qrcode
B" {$ P, V" O D; h9 w# C' W
在线二维码解码识别工具
l1 l1 ~6 M( N2 {' \
http://tools.jb51.net/transcoding/trans_qrcode
. p6 W+ Z" q* j, n' P J9 l
, e& I: Y7 ]- X P, _7 y6 |
n7 o( H& L4 a* ]) A: z
9 x( u- _3 n3 i3 l9 D& P0 u6 |
; C5 |9 j8 R9 v% W
5 M( A+ d2 o7 P- x* X1 z
欢迎光临 cncml手绘网 (http://bbs.cncml.com/)
Powered by Discuz! X3.2