thinkphp5.1生成二维码并解决logo失真
程序员文章站
2022-03-06 13:21:39
...
先上结果 :二维码加上logo,并logo不失真
实现:
用composer添加扩展phpqrcode
引用
use PHPQRCode\QRcode;
代码:
/*** 生成二维码 @param str $text 生成二维码的内容 @param str $path 保存路径 ==false 只显示,不保存到本地路径 @param str $level = "L"; // 容错级别 level 控制二维码容错率,默认为L,范围:L、M、Q、H @param number $size = 10; // 生成图片大小 @param number $margin = 2; // 边距 @param str $saveandprint = false //不明:qrcode.php生成所需 @param str $logo 设置显示在二维码中间的图地址 @param number $from_width 二维码的偏移 参考文档 https://blog.csdn.net/s371795639/article/details/53518724 *****/ public function createQrcode($param = []){ if(empty($param['text'])){ return false; } $text = $param['text']; $path = $param['path'] ? App::getRootPath().$param['path'] : false; $level = $param['level'] ?: 'L'; $size = $param['size'] ?: 3; $margin = $param['margin'] ?: 4; $saveandprint = $param['saveandprint'] ?: false; $logo = $param['logo']; //设置中间图 $logo_qr_width = $param['logo_qr_width']?:5; $from_width = $param['from_width'] ?: 2; $qrcode = new QRcode(); $qrcode->png($text, $path, $level, $size, $margin, $saveandprint); if(empty($logo)){ exit; } //判断是否有中间图 $QR = $path; //已经生成的原始二维码图 if(file_exists(@$logo) && $path !== false){ $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。 $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。 $QR_width = imagesx($QR); $QR_height = imagesy($QR); $logo_width = imagesx($logo); $logo_height = imagesy($logo); $logo_qr_width = $QR_width / $logo_qr_width; //$QR_width / 5; $scale = $logo_width / $logo_qr_width; $logo_qr_height = $logo_height / $scale; $from_width = ($QR_width - $logo_qr_width) / $from_width; // / 2; imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height); imagepng($QR, $path); @header("Content-type: image/png"); imagepng($QR); imagedestroy($QR); imagedestroy($logo); die; // tp5里输出图片在最后必须die掉,否则会输出图片二进制流 } }
调用
//创建二维码 public function createqr(){ $code = 5855451; $data = [ 'text'=>'https://www.bilibili.com/video/av10360081', 'path'=>'public/uploads/qrcode/'.$code.'.png', 'level'=>'Q', 'size'=>6, 'margin'=>1, //'logo'=> App::getRootPath().'public/uploads/avatar/oXAn10DtGNKDz421q_ATefmwAgrI.jpg', 'logo'=> App::getRootPath().'public/uploads/qrcode/logo1.png', 'logo_qr_width' => 3, ]; Utils::createQrcode($data); }
结果:
出现了问题:
中间的logo失真特别厉害
解决方法
public function createQrcode($param = []){ if(empty($param['text'])){ return false; } $text = $param['text']; $path = $param['path'] ? App::getRootPath().$param['path'] : false; $level = $param['level'] ?: 'L'; $size = $param['size'] ?: 3; $margin = $param['margin'] ?: 4; $saveandprint = $param['saveandprint'] ?: false; $logo = $param['logo']; //设置中间图 $logo_qr_width = $param['logo_qr_width']?:5; $from_width = $param['from_width'] ?: 2; $qrcode = new QRcode(); $qrcode->png($text, $path, $level, $size, $margin, $saveandprint); if(empty($logo)){ exit; } //判断是否有中间图 $QR = $path; //已经生成的原始二维码图 if(file_exists(@$logo) && $path !== false){ $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。 $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。 if (imageistruecolor($logo)) { //添加 imagetruecolortopalette($logo, false, 65535);//添加这行代码来解决颜色失真问题 } $QR_width = imagesx($QR); $QR_height = imagesy($QR); $logo_width = imagesx($logo); $logo_height = imagesy($logo); $logo_qr_width = $QR_width / $logo_qr_width; //$QR_width / 5; $scale = $logo_width / $logo_qr_width; $logo_qr_height = $logo_height / $scale; $from_width = ($QR_width - $logo_qr_width) / $from_width; // / 2; imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height); imagepng($QR, $path); @header("Content-type: image/png"); imagepng($QR); imagedestroy($QR); imagedestroy($logo); die; // tp5里输出图片在最后必须die掉,否则会输出图片二进制流 } }
结果:
解决了logo失真的问题
参考文档:https://blog.csdn.net/s371795639/article/details/53518724
上一篇: easyswoole的安装
下一篇: php 获取分类下所有的子集