在项目中使用的到了显示二维码,网上搜了一下php主要使用phpqrcode实现。
common公共函数库中
//phpqrcode 二维码 生成,生成后保存到public qrcode文件中
function create_qrcode($value)
{
vendor("phpqrcode.phpqrcode");
//$value = 'http://www.baidu.com'; //二维码的值
//$outfile = ROOT_PATH . "public/phpqrcode/" . time() . '.jpg'; //保存二维码的路径 false=不生成文件
$level = 'L';容错级别
$size = 4;//生成图片大小
$QRcode = new \QRcode();
ob_start();
$QRcode->png($value, false, $level, $size, 2);
$imageString = base64_encode(ob_get_contents());
ob_end_clean();
return $imageString;//返回base64编码内容
}
需要的地方执行函数 $pay_ewm=create_qrcode($qr);
上面的代码是生成一个base64的字符串,在模板页面如下使用就可以显示图片了。
<img src="https://img-blog.csdnimg.cn/2022010707071040628.png" />
关于QRcode::png方法参数说明:
1.第一个参数
t
e
x
t
,
就
是
上
面
代
码
里
的
U
R
L
网
址
参
数
,
2.
第
二
个
参
数
text,就是上面代码里的URL网址参数, 2.第二个参数
text,就是上面代码里的URL网址参数,2.第二个参数outfile默认为否,不生成文件,只将二维码图片返回,否则需要给出存放生成二维码图片的路径
3.第三个参数
l
e
v
e
l
默
认
为
L
,
这
个
参
数
可
传
递
的
值
分
别
是
L
(
Q
R
E
C
L
E
V
E
L
L
,
74.
第
四
个
参
数
level默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%)。这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比。利用二维维码的容错率,我们可以将头像放置在生成的二维码图片任何区域。 4.第四个参数
level默认为L,这个参数可传递的值分别是L(QRECLEVELL,74.第四个参数size,控制生成图片的大小,默认为4
5.第五个参数
m
a
r
g
i
n
,
控
制
生
成
二
维
码
的
空
白
区
域
大
小
6.
第
六
个
参
数
margin,控制生成二维码的空白区域大小 6.第六个参数
margin,控制生成二维码的空白区域大小6.第六个参数saveandprint,保存二维码图片并显示出来,$outfile必须传递图片路径。
第二个参数默认是false,方法返回的是二进制的图片流。生成在缓冲区的,在页面输出的时候会从缓冲区送到浏览器。所以在代码中是使用log输出是不会记录在日志中的,也不需要使用echo进行内容输出。所以直接使用base64_encode(QRcode::png)是没有用的。
这里使用到了ob_start()方法,打开输出缓冲区,所有的输出信息不在直接发送到浏览器,而是保存在输出缓冲区里面。这里就是把生成的图片流从缓冲区保存到内存对象上,使用base64_encode变成编码字符串,通过json返回给页面。
看一下直接使用QRcode::png返回图片流到浏览器
最后简单说一下ob:
ob是output buffering的简称,而不是output cache,ob用对了是能对速度有一定的帮助,但是盲目的加上ob函数,只会增加CPU额外的负担。说说ob的基本作用:
1.防止在浏览器有输出之后再使用setcookie,或者header,session_start函数造成的错误。(我本以为最开始说的代码是这样的作用,但后来朋友说不是的),其实这样的用法少用为好,养成良好的代码习惯。
2.捕捉对一些不可获取的函数的输出,比如phpinfo会输出一大堆的HTML,但是我们无法用一个变量例如$info=phpinfo();来捕捉,这时候ob就管用了。
3.对输出的内容进行处理,例如进行gzip压缩,例如进行简繁转换,例如进行一些字符串替换。
4.生成静态文件,其实就是捕捉整页的输出,然后存成文件,经常在生成HTML,或者整页缓存中使用。
对于刚才说的第三点中的GZIP压缩,可能是很多人想用,却没有真真用上的,加一个ob_gzhandler这个回调函数就可以了。
ob_start(ob_gzhandler);
内容
echo ob_get_contents() ;
ob_end_flush();
作者:懒猫
Q Q:372835766