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

QQ登录

只需一步,快速开始

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

[复制链接]
跳转到指定楼层
楼主
发表于 2020-7-20 21:02:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本文实例讲述了PHP基于phpqrcode类生成二维码的方法。分享给大家供大家参考,具体如下:' c# ^" C' u  S% v# X& e8 I; U+ k4 S
使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。0 K" f7 a. F. l6 R' }
前期准备:
$ `% y% v" j+ H& K4 z1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/; b% M" q7 L- M8 J: A, ^
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
7 T1 Y! v/ `- G2 l( m: p; F方法解读:
0 J+ `2 ]5 H3 q" n下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):
5 h# [3 v, G0 q+ U% y2 I
  1. public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false). s% s0 \5 c, L7 j
  2. {: f, V) p! }4 w
  3.   $enc = QRencode::factory($level, $size, $margin);
    , K! [, q1 T# }% p9 W( [/ p$ I
  4.   return $enc->encodePNG($text, $outfile, $saveandprint=false);
    * ?. _6 s. c' D
  5. }; x7 R% O$ j. Z" R  a
复制代码
第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;+ x6 B: F6 F* v, Y& Z. f4 N) O
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;8 ]# _7 R! s' m& B( X2 ]
第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
, `% ?! o7 B' f4 B+ e 第4个参数$size:控制生成图片的大小,默认为4;4 O+ _! G4 r8 a9 N' `2 S
第5个参数$margin:控制生成二维码的空白区域大小;
: n* T; \9 v3 K  u* F, G6 R 第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;
* e. Q) _6 H7 z# s8 ?8 Y/ @使用示例:4 k: o8 Q6 u& J+ O# u
1. 生成二维码(生成图片文件)  C1 h$ M4 x0 F; n+ Z7 o8 `
  1. // 1. 生成原始的二维码(生成图片文件)
    1 ^& ^$ w. H( J, q) O
  2. function scerweima($url=''){+ A1 m6 K8 `) s
  3.   require_once 'phpqrcode.php';# d( E8 h- o9 q
  4.   $value = $url;         //二维码内容
    * A6 M! [  r+ q/ }, V* v( u
  5.   $errorCorrectionLevel = 'L';  //容错级别/ r" X$ _0 w  [0 ^- G0 f# E
  6.   $matrixPointSize = 5;      //生成图片大小
    . r5 I! H1 k9 }, x+ Z
  7.   //生成二维码图片6 p5 \8 `! P" h4 w1 Q) `
  8.   $filename = 'qrcode/'.microtime().'.png';
    / U/ b1 U0 c3 v; q3 _: L+ z) ]
  9.   QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
    , J+ A- {8 I9 O! ]! U0 V0 t/ |
  10.   $QR = $filename;        //已经生成的原始二维码图片文件
    1 Y( E, ~: t% k9 ~: g
  11.   $QR = imagecreatefromstring(file_get_contents($QR));7 M" w3 @; \7 C+ R( q
  12.   //输出图片6 [3 G0 G8 A4 J9 l
  13.   imagepng($QR, 'qrcode.png');7 S0 \6 @3 T: }* E$ @
  14.   imagedestroy($QR);- H5 i% Y4 K& h2 y5 W( S# b9 }$ k) h
  15.   return '<img src="qrcode.png" alt="使用微信扫描支付">';
    ' L7 b- V4 ^4 P
  16. }( l0 K9 D3 r- B& @6 _+ D% Y2 Y% m
  17. //调用查看结果
    . j; j% B' V6 K9 H
  18. echo scerweima('https://www.baidu.com');
    8 e4 D* h2 n+ V' ^) t3 x
复制代码
2. 在生成的二维码中加上logo(生成图片文件)5 j) @0 `* k* F0 p+ ]
  1. //2. 在生成的二维码中加上logo(生成图片文件), ~) Q& L; b7 D
  2. function scerweima1($url=''){
    $ r1 o9 x/ |8 Z# Y( Y6 X% w
  3.   require_once 'phpqrcode.php';. i1 x2 G; \5 w  X0 h* D. b
  4.   $value = $url;         //二维码内容8 ?( [; ]& G( {  K; U9 I5 z6 j
  5.   $errorCorrectionLevel = 'H';  //容错级别. t) p5 d# L1 d, A8 K
  6.   $matrixPointSize = 6;      //生成图片大小
    # @0 d" X/ Z8 U1 F* ?8 r
  7.   //生成二维码图片
    , A! U6 V0 w5 D
  8.   $filename = 'qrcode/'.microtime().'.png';$ A- i5 B& ^  A! a0 O
  9.   QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);' s8 H+ ?2 _7 _  O% M0 q
  10.   $logo = 'qrcode/logo.jpg'; //准备好的logo图片3 [6 l% k# Y  v5 O3 t
  11.   $QR = $filename;      //已经生成的原始二维码图
    1 H, t* Y' z- z. Q0 |9 D- B6 M
  12.   if (file_exists($logo)) {
    # G; g3 N  I5 _6 f6 }) \
  13.     $QR = imagecreatefromstring(file_get_contents($QR));    //目标图象连接资源。
    3 p7 A  a: b# m0 v  _1 V7 q
  14.     $logo = imagecreatefromstring(file_get_contents($logo));  //源图象连接资源。
    # i8 a& {& E+ O) K  z/ {
  15.     $QR_width = imagesx($QR);      //二维码图片宽度
    ! y: r# B" U3 K6 t* H1 D5 m
  16.     $QR_height = imagesy($QR);     //二维码图片高度# l- o1 E- J% g1 O2 n
  17.     $logo_width = imagesx($logo);    //logo图片宽度9 W- N" R/ z% s+ A+ u4 a; u9 y
  18.     $logo_height = imagesy($logo);   //logo图片高度
    , E5 x# u+ t5 }! ]
  19.     $logo_qr_width = $QR_width / 4;   //组合之后logo的宽度(占二维码的1/5)
    3 m8 p% E* k. W
  20.     $scale = $logo_width/$logo_qr_width;  //logo的宽度缩放比(本身宽度/组合后的宽度)
    + }9 U" s5 h! v+ f/ _
  21.     $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
    # Q( R7 A2 S- I2 B; O" C
  22.     $from_width = ($QR_width - $logo_qr_width) / 2;  //组合之后logo左上角所在坐标点
    / t! _6 N/ R6 Z8 t/ H+ B: S
  23.     //重新组合图片并调整大小7 t8 O$ ]3 g: f  }$ p
  24.     /*  @  U. Y4 p# y7 k3 U6 A
  25.      * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中$ l" k+ x+ n: s8 v
  26.      */
    / w9 G2 N& y0 h- d0 f
  27.     imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
    * |" m3 G  l; X
  28.   }
    & s4 {7 {+ V% M$ |0 b& e
  29.   //输出图片
    ; A7 r, p. v# C, p
  30.   imagepng($QR, 'qrcode.png');
    8 ?5 g! |2 X! g( n
  31.   imagedestroy($QR);
    & b0 C7 E7 G- i) U' z
  32.   imagedestroy($logo);
    # X- T. I. S& {3 d
  33.   return '<img src="qrcode.png" alt="使用微信扫描支付">';
    8 L: y  K& C! v  [( ]9 s" Y
  34. }) O6 }) C# Z) B
  35. //调用查看结果( y% m. t* B' V: a0 P
  36. echo scerweima1('https://www.baidu.com');
    * _: ]% l% @7 `& U; i9 p
复制代码
3. 生成二维码(不生成图片文件)
3 C# U& ?* U* c" L* i$ {% s
  1. //3. 生成原始的二维码(不生成图片文件)+ K6 v1 M  d6 H% L4 \5 m
  2. function scerweima2($url=''){- D  B, k7 P) ^
  3.   require_once 'phpqrcode.php';
    - T7 K& S8 V) U/ j
  4.   $value = $url;         //二维码内容+ c. i1 A' b1 X& n6 \- r
  5.   $errorCorrectionLevel = 'L';  //容错级别
    ) R4 T) y: a4 x; X
  6.   $matrixPointSize = 5;      //生成图片大小
    5 j7 @1 R0 h( x) Y3 B
  7.   //生成二维码图片, C" y* Y( Q) G; P) \( `
  8.   $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
    2 k& E$ T; V/ V. g0 Y
  9. }
    % S/ v& A; e/ a9 ~5 @
  10. //调用查看结果
    % h7 q( ~! N% H
  11. scerweima2('https://www.baidu.com');9 |; m6 f: j% Q4 L
复制代码
前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。
* B2 S: f! R" d: aPS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:
) ?% z. B$ d5 W/ W% O+ Y& j在线生成二维码工具(加强版)4 H0 R# Y# _, F& X
http://tools.jb51.net/transcoding/jb51qrcode! L( d% Q+ _6 z/ k  Y
在线二维码解码识别工具
; V1 x; H8 j! I( k( ?2 h
http://tools.jb51.net/transcoding/trans_qrcode
! f2 T$ @) f* a; ^7 \
$ J0 }/ |% f* z, v' n
9 [6 L8 z6 E% W8 O
5 a7 o8 a! o7 P& W0 `
$ Z* I" H* s. e9 j* T: s# y! z
4 M% F) S; Q8 _
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

GMT+8, 2026-4-30 20:49 , Processed in 0.094959 second(s), 21 queries .

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