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" y1.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
  1. 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
  2. {& b4 f! w% |$ O1 H5 P8 g
  3.   $enc = QRencode::factory($level, $size, $margin);: C1 h/ K6 ^/ R% p
  4.   return $enc->encodePNG($text, $outfile, $saveandprint=false);
    0 _# o  b5 i) N$ ^
  5. }
    ) 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. // 1. 生成原始的二维码(生成图片文件); Y1 z: R1 j$ p) ~& ?, a; C9 n8 _
  2. function scerweima($url=''){
    1 n/ g4 g- |# o; L- }
  3.   require_once 'phpqrcode.php';9 j( w+ d7 F; t3 ~0 K9 [
  4.   $value = $url;         //二维码内容
    ' x; v0 h' _2 a4 U5 d/ y9 F* y
  5.   $errorCorrectionLevel = 'L';  //容错级别
    7 x  [1 [: Z) K
  6.   $matrixPointSize = 5;      //生成图片大小7 b+ _+ ^+ ?8 [8 I& v- @2 a
  7.   //生成二维码图片
    . z* t7 o! h. h& P& D
  8.   $filename = 'qrcode/'.microtime().'.png';
    + y% o. t9 {" r
  9.   QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
    0 K0 ^( S1 p/ f' Q  K1 F; h
  10.   $QR = $filename;        //已经生成的原始二维码图片文件
    , C4 T8 x& f+ Z: E: g8 o4 f
  11.   $QR = imagecreatefromstring(file_get_contents($QR));
    & B* r* ?  @& K" j$ l# r) |
  12.   //输出图片
    5 u1 j2 {0 S. I6 Y# W. V
  13.   imagepng($QR, 'qrcode.png');
    2 _; V1 W8 ~8 J% Z) m  g/ v  N1 d
  14.   imagedestroy($QR);
    & L  \+ {3 h/ b6 b$ a
  15.   return '<img src="qrcode.png" alt="使用微信扫描支付">';
    . U- N7 T) I: M! h  [
  16. }+ ~4 a7 z$ T) G4 f" p
  17. //调用查看结果
    # m% K1 _: R8 Y  Y( [( }2 q
  18. echo scerweima('https://www.baidu.com');
    2 H  ^/ _4 Q+ q# x
复制代码
2. 在生成的二维码中加上logo(生成图片文件)
& c5 C3 @, h  h
  1. //2. 在生成的二维码中加上logo(生成图片文件)' @2 n+ a4 W3 p- [; ?7 z# w
  2. function scerweima1($url=''){3 m# m2 `! f1 V3 ]
  3.   require_once 'phpqrcode.php';6 I9 u$ b" h6 C% G. t1 d
  4.   $value = $url;         //二维码内容0 @! w2 w9 N; k7 e6 w
  5.   $errorCorrectionLevel = 'H';  //容错级别
    " ^( Z6 s. ?; V) N1 R4 O, d& X
  6.   $matrixPointSize = 6;      //生成图片大小9 y6 j" u3 b& _' @4 g
  7.   //生成二维码图片" B( a% L( _4 y  P3 a
  8.   $filename = 'qrcode/'.microtime().'.png';( p# U- y/ P. L* P: i
  9.   QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
    7 @  q- p0 u" P/ X0 M$ d( h
  10.   $logo = 'qrcode/logo.jpg'; //准备好的logo图片
    4 @* G& S) S$ e6 N+ K' M
  11.   $QR = $filename;      //已经生成的原始二维码图9 z) W  s# p0 D3 }! R0 K& w- W
  12.   if (file_exists($logo)) {
    * l' F7 j, v* I5 R* Z
  13.     $QR = imagecreatefromstring(file_get_contents($QR));    //目标图象连接资源。
    : j- \" Y0 m! W. V$ t/ X# W# E
  14.     $logo = imagecreatefromstring(file_get_contents($logo));  //源图象连接资源。1 W, u$ i5 l7 u! O3 E/ W
  15.     $QR_width = imagesx($QR);      //二维码图片宽度/ Y! V, U- ?7 A1 D
  16.     $QR_height = imagesy($QR);     //二维码图片高度
    8 [0 T. q7 \% [
  17.     $logo_width = imagesx($logo);    //logo图片宽度+ F9 F8 z2 s3 f& @
  18.     $logo_height = imagesy($logo);   //logo图片高度8 V5 }+ |: V( C$ R
  19.     $logo_qr_width = $QR_width / 4;   //组合之后logo的宽度(占二维码的1/5)
    1 J7 o8 x7 J3 B) u
  20.     $scale = $logo_width/$logo_qr_width;  //logo的宽度缩放比(本身宽度/组合后的宽度)
    " m. M$ _8 q$ `% V9 `
  21.     $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
    6 d+ n/ U" K) U' S8 P  z& E$ ^( e
  22.     $from_width = ($QR_width - $logo_qr_width) / 2;  //组合之后logo左上角所在坐标点
    7 Y. A& s! r. s+ X- c! p$ V
  23.     //重新组合图片并调整大小
    7 W: c, x7 \8 C* h' p
  24.     /*
    & b/ h* ~4 C$ ~) r1 Q
  25.      * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
    $ y& s1 p7 e5 a/ Q( j* ?; y
  26.      */
    - M# ^; F! V' m1 l5 r" B" z7 o
  27.     imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);, t5 _1 E5 H# L
  28.   }
    9 a4 |' R4 b0 q- X
  29.   //输出图片2 d' C6 R* V% J: ~: m! d1 d
  30.   imagepng($QR, 'qrcode.png');7 J& D% Z. y* I! i, P+ R
  31.   imagedestroy($QR);6 o7 e2 u# u# X' ^! T
  32.   imagedestroy($logo);, J. v7 \  j8 y9 W6 g
  33.   return '<img src="qrcode.png" alt="使用微信扫描支付">';
      S# ^4 o3 x3 K1 u# g
  34. }& @3 h# q8 }; O  B) d1 @
  35. //调用查看结果
    , |; u+ [! F4 I- U0 E+ j
  36. echo scerweima1('https://www.baidu.com');* g' m6 Z+ N6 `3 @$ S6 C
复制代码
3. 生成二维码(不生成图片文件)  Q2 O+ X/ |% A7 T2 h6 F
  1. //3. 生成原始的二维码(不生成图片文件)3 C6 v2 G8 Q1 w1 t2 l0 D, V
  2. function scerweima2($url=''){' }' `9 y- w1 p$ g
  3.   require_once 'phpqrcode.php';/ @- P  T7 G4 {- t4 v
  4.   $value = $url;         //二维码内容
    , E1 z0 ^. W1 Z0 h
  5.   $errorCorrectionLevel = 'L';  //容错级别
    9 Y7 `4 R" S: Z5 n: z
  6.   $matrixPointSize = 5;      //生成图片大小
    + U! S! p4 \* a
  7.   //生成二维码图片1 s! b: ]; y/ x! c
  8.   $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);  G1 Z$ N* L" {2 k* T& k
  9. }0 t! ]0 v3 p# S: R. t% |
  10. //调用查看结果
    $ K( j4 p( n8 Y; x- a8 ~2 T1 O
  11. 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_qrcode0 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