您尚未登录,请登录后浏览更多内容! 登录 | 立即注册

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 15270|回复: 0
打印 上一主题 下一主题

[php学习资料] PHP基于phpqrcode类生成二维码的方法详解

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-20 21:02:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
" k: X% i# S0 f, Y- {" ^- {6 M使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
; X* [% R$ D: E) H  Y- f5 U- k前期准备:9 H; A% U3 d/ q1 E
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/
3 U+ Z7 e' Z7 M& t* |" L0 x$ ~) _ 2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
8 F; ^1 N" P% _  |9 q方法解读:, Z+ w, o$ |4 W5 Y5 B- N
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
' G) j: _4 ^+ M
  1. public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)/ T& e, x. V: [& w5 l
  2. {5 q2 N. g1 p& x0 o3 q
  3.   $enc = QRencode::factory($level, $size, $margin);
    * u2 W( y# Z& z5 E7 u. _
  4.   return $enc->encodePNG($text, $outfile, $saveandprint=false);; Z" P3 W$ E( W; T: w) N+ g, g) K
  5. }
    : X6 g- E$ D( L4 z7 D
复制代码
第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;
' O3 g/ _/ H0 l, l6 r 第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;0 s( K2 S/ g: C0 b' s$ l
第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
* e. M& R8 K& ]1 o5 q 第4个参数$size:控制生成图片的大小,默认为4;
: _/ G, S8 R$ n% z: y 第5个参数$margin:控制生成二维码的空白区域大小;
9 `( D7 B3 O+ [. v6 B; O2 S( ~ 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
& |- l# P0 G6 x使用示例:( m$ Z3 [6 K9 c5 w3 s
1. 生成二维码(生成图片文件)
. M8 i* D( s; J) m7 g& F& z7 j- \' z& X9 a
  1. // 1. 生成原始的二维码(生成图片文件)7 ~3 V0 G9 K0 l! k4 k( b
  2. function scerweima($url=''){7 E. w# c  I# R4 d3 l
  3.   require_once 'phpqrcode.php';
    / R$ P3 C! X6 W
  4.   $value = $url;         //二维码内容* F0 Z- P0 E8 S
  5.   $errorCorrectionLevel = 'L';  //容错级别+ |, ^1 b$ H- Q  S( ?
  6.   $matrixPointSize = 5;      //生成图片大小
    5 ]- ]# Y! _' U9 Y; N/ u1 N
  7.   //生成二维码图片4 N$ N' i0 P- |( {3 y% w
  8.   $filename = 'qrcode/'.microtime().'.png';
    3 [5 n/ W- i5 v* p: ?2 h. F, ~6 h
  9.   QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);# z$ u8 y2 Z  c* k
  10.   $QR = $filename;        //已经生成的原始二维码图片文件: x! K& F: p. |( e, w
  11.   $QR = imagecreatefromstring(file_get_contents($QR));% C3 D2 x% Z" g+ Q: M
  12.   //输出图片
    3 G/ Z# @6 e9 f: t* O2 O, n
  13.   imagepng($QR, 'qrcode.png');: u$ C  C+ P; X: i
  14.   imagedestroy($QR);' S& H/ h! L7 P+ E# y; `$ L
  15.   return '<img src="qrcode.png" alt="使用微信扫描支付">';1 S8 U# @; m+ ]* }
  16. }
    2 x- e# K  ^3 L$ b' R; @4 x2 h3 K
  17. //调用查看结果- w: z! @$ \( Y% W
  18. echo scerweima('https://www.baidu.com');1 P; I# E5 K3 \& ~, c) g$ p6 ~+ Y
复制代码
2. 在生成的二维码中加上logo(生成图片文件). B* @5 b  L) {' J0 I/ u/ k1 `
  1. //2. 在生成的二维码中加上logo(生成图片文件)  P  h- y$ ?9 \. z. _
  2. function scerweima1($url=''){
      F1 P, t2 ^8 i* B
  3.   require_once 'phpqrcode.php';$ G& `) B' @! r- i: {4 e
  4.   $value = $url;         //二维码内容
    / }: w' [, {1 \5 L7 B( Q, {
  5.   $errorCorrectionLevel = 'H';  //容错级别, S' c( ^7 L! ~6 x, F! I9 d
  6.   $matrixPointSize = 6;      //生成图片大小
    & S5 z$ u3 [1 s0 h; C0 {- }6 {# s
  7.   //生成二维码图片
    9 e0 ]( D3 i5 p. t6 K( A3 s
  8.   $filename = 'qrcode/'.microtime().'.png';
    0 L+ j3 k# h( @- f1 l/ E+ z
  9.   QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);) v" G5 q9 X% z* t1 o8 b( B# n
  10.   $logo = 'qrcode/logo.jpg'; //准备好的logo图片
    ! \) O( y8 F) ^3 S0 F# y+ }
  11.   $QR = $filename;      //已经生成的原始二维码图; g* u# r- ]0 m* D# f! O+ R' I
  12.   if (file_exists($logo)) {
    ( a6 [# }0 f  Y  K) a2 B; l
  13.     $QR = imagecreatefromstring(file_get_contents($QR));    //目标图象连接资源。
    / T8 u/ `# P+ F( L9 J
  14.     $logo = imagecreatefromstring(file_get_contents($logo));  //源图象连接资源。! `& }! C+ S/ o1 w) ~/ ]. h
  15.     $QR_width = imagesx($QR);      //二维码图片宽度
    6 q- T5 n2 B8 h6 P$ m. A
  16.     $QR_height = imagesy($QR);     //二维码图片高度' e) K  w: Z, N; V/ N% i+ u8 C! F( y
  17.     $logo_width = imagesx($logo);    //logo图片宽度
    8 N, g2 j, O% \+ O9 c0 J% ~8 E' X
  18.     $logo_height = imagesy($logo);   //logo图片高度
    6 o+ @+ X! I+ Q1 {4 f$ Q
  19.     $logo_qr_width = $QR_width / 4;   //组合之后logo的宽度(占二维码的1/5), w, \7 P" I# k: d9 H) n! B& G
  20.     $scale = $logo_width/$logo_qr_width;  //logo的宽度缩放比(本身宽度/组合后的宽度)3 e5 D! ^8 D. J2 @- v
  21.     $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
    : x9 M8 w0 o' ~8 \0 I, ?
  22.     $from_width = ($QR_width - $logo_qr_width) / 2;  //组合之后logo左上角所在坐标点
    8 q: N$ ?: F! U4 r" C
  23.     //重新组合图片并调整大小/ |# i, n) B$ _: ^5 f/ P5 v
  24.     /*
    0 B+ B" Y5 e* R& ~  n/ B/ v. c
  25.      * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
    ; L3 p  ~1 }9 n: e1 Z) b
  26.      */1 W, L+ `- j& f; H2 _4 w: p
  27.     imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
    " t9 D' L, f7 i$ g
  28.   }; Y" O0 M# J; d9 l  I% D
  29.   //输出图片3 a! n0 F) G7 {1 e4 {  J
  30.   imagepng($QR, 'qrcode.png');+ p: L/ W' ]! x# @( V0 n9 m
  31.   imagedestroy($QR);) o  j2 i& ~" x  t3 [- Y% `* j* U; l
  32.   imagedestroy($logo);
    9 q7 G* i! A- ~
  33.   return '<img src="qrcode.png" alt="使用微信扫描支付">';7 g* J/ i" W8 j) y6 @* N
  34. }
    2 D6 C  \/ G. L. O( Q% m
  35. //调用查看结果
    ! X6 B2 d( L3 L1 P- Z9 t9 H
  36. echo scerweima1('https://www.baidu.com');
    * L3 |! Y& U9 k& i  \, ?* k6 }
复制代码
3. 生成二维码(不生成图片文件)
7 }( S( C, N3 g* T5 N
  1. //3. 生成原始的二维码(不生成图片文件)
    ( Q) L5 R8 C& J3 p, T, ~
  2. function scerweima2($url=''){
    $ N" _2 E) U2 v" k; |: K4 z
  3.   require_once 'phpqrcode.php';
    + e8 j+ }7 v% a- q
  4.   $value = $url;         //二维码内容  U5 n1 d) s" b; z" K. Z
  5.   $errorCorrectionLevel = 'L';  //容错级别0 J. C2 m3 U8 n+ s0 N' f2 p
  6.   $matrixPointSize = 5;      //生成图片大小
    . q" i2 k/ P8 m$ i$ v
  7.   //生成二维码图片. W( \& u. z. s$ G8 S
  8.   $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);6 T; T& F, Y* V6 N
  9. }
    ! G+ ?1 c& }: _, y
  10. //调用查看结果
    , D3 D0 @( F/ n- E6 p
  11. scerweima2('https://www.baidu.com');
    & L5 `& [- L0 y; R, Q
复制代码
前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。  R: J% o% m7 u  c: X& z- z
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:$ C. `. C5 n  C! ?- T
在线生成二维码工具(加强版)  l; O6 j/ i2 ~0 H1 \# a
http://tools.jb51.net/transcoding/jb51qrcode( P% Q5 T1 M" d
在线二维码解码识别工具
2 l$ X8 b$ O9 m8 e* W( `2 J
http://tools.jb51.net/transcoding/trans_qrcode
1 |0 B  q$ I" X/ e1 h5 y, M" N  @! w/ g
# {& S' p  J: k- |' k
( ?' i1 G2 e: D, U  Y6 S; e, g; k3 c

1 X$ ?! S' u6 O' c/ \- e% Q# w/ U8 _* v8 m
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-6-19 22:29 , Processed in 0.051719 second(s), 20 queries .

Copyright © 2001-2026 Powered by cncml! X3.2. Theme By cncml!