cncml手绘网

标题: PHP基于phpqrcode类生成二维码的方法详解 [打印本页]

作者: admin    时间: 2020-7-20 21:02
标题: PHP基于phpqrcode类生成二维码的方法详解
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:
2 T6 }2 F, F* C1 @9 p1 _; m  u使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。2 D: |  r6 w2 r- s8 ?, f" ^
前期准备:+ c+ k% O% l9 ~- O5 ^* |4 a. M
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/" b0 N3 Y2 n) ^
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)# H! L  D5 e# g5 E# i- q( i+ x; j1 t
方法解读:
4 z4 S5 r: `& M下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
# m2 u9 H- a) ]# }7 b" I/ Q+ P' F
  1. public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false)1 j; ?2 D, e9 `/ B# O
  2. {
    % i  _- n& f7 n& e
  3.   $enc = QRencode::factory($level, $size, $margin);
    8 L( L  d# T! c
  4.   return $enc->encodePNG($text, $outfile, $saveandprint=false);
    5 }  F6 I' ?' {* [/ G/ k! q
  5. }! ]: J2 N2 Z5 O% j
复制代码
第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;! p( ?. m. D3 ]# T1 g; m
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
5 t- R- i* B" ?" ^- Z7 D/ q 第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
" H" W1 R8 o5 n- n/ X 第4个参数$size:控制生成图片的大小,默认为4;
  t) {8 @. O! S" @9 ` 第5个参数$margin:控制生成二维码的空白区域大小;
- @8 C( X* r& [ 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;, X2 S/ u5 x% Q' u3 J
使用示例:: w4 X( x" v* }- Y) p6 c$ N" S( i3 b
1. 生成二维码(生成图片文件)7 q; B2 F" P3 Q! `7 m+ A# r7 T
  1. // 1. 生成原始的二维码(生成图片文件)
    ! D7 ]1 `1 g3 t
  2. function scerweima($url=''){
    / x0 b* X0 z5 O9 O4 x( \# T2 @
  3.   require_once 'phpqrcode.php';5 I, }  [& |; ?1 m7 i
  4.   $value = $url;         //二维码内容
    5 L, J. e; b0 `# `8 \2 [
  5.   $errorCorrectionLevel = 'L';  //容错级别% ]+ C! g  N  o1 s; T% E0 M
  6.   $matrixPointSize = 5;      //生成图片大小$ {! p, |/ G& J: p4 T
  7.   //生成二维码图片. K' t( ^1 e0 P1 \4 c5 C7 d7 F% ]
  8.   $filename = 'qrcode/'.microtime().'.png';6 }; |& K7 x; Q1 ~( z) F
  9.   QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
    9 J6 r) u  v6 g8 {
  10.   $QR = $filename;        //已经生成的原始二维码图片文件) v5 L+ S% l# X2 Z* D2 T
  11.   $QR = imagecreatefromstring(file_get_contents($QR));' W! a9 w; J0 \* [7 |" @
  12.   //输出图片, W0 |# \8 G, K. ?
  13.   imagepng($QR, 'qrcode.png');
    . E# _' F* k. ~! v1 b/ E: w/ z+ ]
  14.   imagedestroy($QR);, X! {8 s* c  Z9 c7 p& T0 Q
  15.   return '<img src="qrcode.png" alt="使用微信扫描支付">';
    " k  p, b. E* ?3 W" i, f2 D
  16. }0 _' p5 ]5 G% Q- U
  17. //调用查看结果
    / d& ~5 W  V! z; h: u5 {; A2 \
  18. echo scerweima('https://www.baidu.com');0 k! M, o2 T7 }) W) X6 ~. \4 _- g4 J- ]
复制代码
2. 在生成的二维码中加上logo(生成图片文件)  w2 Y0 W" B' r4 m9 `6 w
  1. //2. 在生成的二维码中加上logo(生成图片文件)
    8 ]& v3 L* ^. ]" D2 x
  2. function scerweima1($url=''){1 f8 d0 U" {7 T& ?
  3.   require_once 'phpqrcode.php';
    / r' |/ ?  b+ Y1 I4 s0 f0 G
  4.   $value = $url;         //二维码内容
    # F! J5 x/ o. C- a5 q, R! r# M5 ^
  5.   $errorCorrectionLevel = 'H';  //容错级别
    # X  n5 c& d: a! P
  6.   $matrixPointSize = 6;      //生成图片大小. X% @1 l3 G3 B! O5 u  [
  7.   //生成二维码图片
    ; ?% Z4 d! x4 y. }% g
  8.   $filename = 'qrcode/'.microtime().'.png';
    # [: `) R. ^5 }% {3 J* F
  9.   QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
    , h8 q4 W2 @3 i/ @
  10.   $logo = 'qrcode/logo.jpg'; //准备好的logo图片
    + c2 [: c6 J1 N0 V2 ~. `
  11.   $QR = $filename;      //已经生成的原始二维码图, Y. y! r1 b( Q* S; u
  12.   if (file_exists($logo)) {5 c4 m! @9 H# w: ~2 S
  13.     $QR = imagecreatefromstring(file_get_contents($QR));    //目标图象连接资源。
    4 D; C$ v: T9 J+ @8 H' M  O- K
  14.     $logo = imagecreatefromstring(file_get_contents($logo));  //源图象连接资源。
    : {% f5 l) f: g9 u& g/ J+ @
  15.     $QR_width = imagesx($QR);      //二维码图片宽度% C2 _5 B3 S9 a, b! v- Z
  16.     $QR_height = imagesy($QR);     //二维码图片高度
    % F7 g* M: q& o
  17.     $logo_width = imagesx($logo);    //logo图片宽度
    + r3 k6 V# f$ c/ _
  18.     $logo_height = imagesy($logo);   //logo图片高度/ ~4 b3 d* l) Z8 D8 V
  19.     $logo_qr_width = $QR_width / 4;   //组合之后logo的宽度(占二维码的1/5)1 Z; W! b5 R' w$ ~) P9 z3 s
  20.     $scale = $logo_width/$logo_qr_width;  //logo的宽度缩放比(本身宽度/组合后的宽度)0 y) x6 \3 ?. J/ a/ D
  21.     $logo_qr_height = $logo_height/$scale; //组合之后logo的高度2 l0 u1 V& K5 ~, _: t3 q9 P
  22.     $from_width = ($QR_width - $logo_qr_width) / 2;  //组合之后logo左上角所在坐标点
    1 R4 m: _/ C# ~* v8 L% G/ m
  23.     //重新组合图片并调整大小' }) O3 l( u3 T8 G9 Y0 H: H3 o
  24.     /*
    & c" g4 X6 G" K. S( E5 z: X
  25.      * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
    . S1 I! [+ ]: `; |
  26.      */; a! e/ U1 L4 ?0 c# U* ^
  27.     imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
    1 [4 X3 f7 u/ o% _
  28.   }/ I0 X! G) O* m
  29.   //输出图片9 R& q. I% m" b7 ?. Y8 J# _
  30.   imagepng($QR, 'qrcode.png');4 X4 L1 s" `- x
  31.   imagedestroy($QR);
      ^, x! i6 J- I6 m% o
  32.   imagedestroy($logo);
    3 K3 r/ l* z% j& a# t
  33.   return '<img src="qrcode.png" alt="使用微信扫描支付">';7 a  j- J( I  X6 E, Y' C
  34. }) F7 y; q( n1 }& }' D# j
  35. //调用查看结果0 E" K) [6 a# I$ M- p
  36. echo scerweima1('https://www.baidu.com');6 P: R+ B8 p  w5 M1 P5 L/ R
复制代码
3. 生成二维码(不生成图片文件), I3 X" d. T5 B/ s3 {
  1. //3. 生成原始的二维码(不生成图片文件)2 c0 k9 t2 R) K4 F1 z8 Y# T
  2. function scerweima2($url=''){" s3 D( d! _$ a5 s' _
  3.   require_once 'phpqrcode.php';
    , l  H2 l& d6 I$ b
  4.   $value = $url;         //二维码内容
    " ]5 E; N$ a7 [. x* g% ]/ S
  5.   $errorCorrectionLevel = 'L';  //容错级别
    ; n$ _5 l* y. Y/ @8 Z
  6.   $matrixPointSize = 5;      //生成图片大小
    , v& T" d3 X* y( i0 A
  7.   //生成二维码图片
    % B& Z5 _  {  s; Z' m: t: j6 s
  8.   $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);; n0 x* s1 d) p* h1 P) O; [
  9. }
    4 L; ]# ~0 ^; v5 x
  10. //调用查看结果
    ) }9 |9 Z5 `) D+ P) c8 s
  11. scerweima2('https://www.baidu.com');& y0 E! @  i7 [$ j3 X) C, }& d2 m
复制代码
前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。0 `+ G$ d5 b' ]* u1 K; v) H
PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:" h+ Y8 u. u* `
在线生成二维码工具(加强版). s( p1 r3 X% B9 m  m
http://tools.jb51.net/transcoding/jb51qrcode% l* v; V/ _5 R- ?/ W" |/ N5 ~
在线二维码解码识别工具/ m: I3 m. T& F8 l& j
http://tools.jb51.net/transcoding/trans_qrcode0 c% |6 P9 k% F! D/ o

, _& l8 `' Z8 v4 E9 H' l. K; \2 K( H
" L2 {, ~, k/ ?7 U4 Z

! W% P" m, X* f* k* C; z+ ~! N
/ o/ D& P- t" d& T




欢迎光临 cncml手绘网 (http://bbs.cncml.com/) Powered by Discuz! X3.2