writer(new PngWriter()) ->data($content) ->size($qrSize) ->margin(0) ->build(); $qrImage = imagecreatefromstring($result->getString()); // 创建画布(加上下方文字区和边距) $canvasWidth = $qrSize + $padding * 2; $canvasHeight = $qrSize + $textHeight + $padding * 2; $image = imagecreatetruecolor($canvasWidth, $canvasHeight); // 背景白色 $white = imagecolorallocate($image, 255, 255, 255); imagefill($image, 0, 0, $white); // 黑色字体 $black = imagecolorallocate($image, 0, 0, 0); // 合并二维码图像 imagecopy($image, $qrImage, $padding, $padding, 0, 0, $qrSize, $qrSize); // 写文字 $textWidth = imagefontwidth($font) * strlen($content); $x = ($canvasWidth - $textWidth) / 2; $y = $qrSize + $padding + 5; imagestring($image, $font, $x, $y, $content, $black); // 生成文件名 $filename = $address. '.png'; $relativePath = 'recharge/' . $filename; $storagePath = storage_path('app/public/' . $relativePath); // 确保目录存在 @mkdir(dirname($storagePath), 0777, true); // 保存图片到文件 imagepng($image, $storagePath); // 清理 imagedestroy($qrImage); imagedestroy($image); // 返回 public 存储路径(可用于 URL) return 'storage/'.$relativePath; // 或返回 Storage::url($relativePath); } /** * 判断指定地址的二维码是否已生成(已存在文件) * * @param string $address 充值地址 * @return */ public static function rechargeQrCodeExists(string $address) { $filename = $address . '.png'; $relativePath = 'recharge/' . $filename; $storagePath = storage_path('app/public/' . $relativePath); $path = ''; if(file_exists($storagePath)){ $path = 'storage/'.$relativePath; } return $path; } /** * @description: 转成树形数据 * @param {*} $list 初始数据 * @param {*} $pid 父id * @param {*} $level 层级 * @param {*} $pid_name pid字段名称 默认pid * @param {*} $id_name 主键id 名称 * @return {*} */ public static function toTree($list,$pid=0,$level=0,$pid_name='pid',$id_name='id') { $arr=[]; $level++; foreach($list as $k => $v){ if($pid==$v[$pid_name]){ $v['level']=$level; $v['children']=self::toTree($list,$v[$id_name],$level,$pid_name,$id_name); $arr[]=$v; } } return $arr; } }