生成二维码
This commit is contained in:
99
application/common/QrCodeImage.php
Normal file
99
application/common/QrCodeImage.php
Normal file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
|
||||
namespace app\common;
|
||||
use Endroid\QrCode\Color\Color;
|
||||
use Endroid\QrCode\ErrorCorrectionLevel;
|
||||
use Endroid\QrCode\Logo\Logo;
|
||||
use Endroid\QrCode\QrCode;
|
||||
use Endroid\QrCode\Writer\PngWriter;
|
||||
|
||||
|
||||
class QrCodeImage
|
||||
{
|
||||
/**
|
||||
* 生成二维码
|
||||
* @param string $content 内容
|
||||
* @param string $savePath 保存路径(可选)
|
||||
* @param int $size 尺寸(像素)
|
||||
* @return mixed
|
||||
*/
|
||||
|
||||
public static function generate($content, $size = 300, $savePath = '')
|
||||
{
|
||||
try {
|
||||
// 创建二维码实例
|
||||
$qrCode = new QrCode($content);
|
||||
$qrCode->setSize($size);
|
||||
$qrCode->setMargin(10);
|
||||
|
||||
// 设置颜色(RGB格式)
|
||||
$qrCode->setForegroundColor(new Color(0, 0, 0));
|
||||
$qrCode->setBackgroundColor(new Color(255, 255, 255)); // 白色
|
||||
|
||||
// 使用PNG写入器
|
||||
$writer = new PngWriter();
|
||||
$result = $writer->write($qrCode);
|
||||
|
||||
if ($savePath) {
|
||||
// 确保目录存在
|
||||
if (!is_dir(dirname($savePath))) {
|
||||
mkdir(dirname($savePath), 0755, true);
|
||||
}
|
||||
$result->saveToFile($savePath);
|
||||
return $savePath;
|
||||
}
|
||||
|
||||
// 直接输出到浏览器
|
||||
header('Content-Type: ' . $result->getMimeType());
|
||||
echo $result->getString();
|
||||
exit;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
// 记录错误日志
|
||||
\think\Log::error('二维码生成失败: ' . $e->getMessage());
|
||||
return false;
|
||||
}
|
||||
}
|
||||
/**
|
||||
* 生成带Logo的二维码
|
||||
* @param string $content 内容
|
||||
* @param string $logoPath Logo路径
|
||||
* @param int $qrSize 二维码尺寸(像素)
|
||||
* @param int $logoSize Logo尺寸(像素)
|
||||
* @param string $savePath 保存路径(可选)
|
||||
*/
|
||||
public static function withLogo(string $content,string $logoPath,int $qrSize = 20,int $logoSize = 20,string $savePath = null) {
|
||||
try {
|
||||
// 基础二维码配置
|
||||
$qrCode = new QrCode($content);
|
||||
$qrCode->setSize($qrSize);
|
||||
$qrCode->setMargin(20);
|
||||
// $qrCode->setErrorCorrectionLevel(ErrorCorrectionLevel::HIGH);
|
||||
$qrCode->setForegroundColor(new Color(0, 0, 0));
|
||||
$qrCode->setBackgroundColor(new Color(255, 255, 255));
|
||||
|
||||
// Logo配置
|
||||
$logo = Logo::create($logoPath)
|
||||
->setResizeToWidth($logoSize)
|
||||
->setPunchoutBackground(true); // 透明背景穿透
|
||||
|
||||
// 合并生成
|
||||
$writer = new PngWriter();
|
||||
$result = $writer->write($qrCode, $logo);
|
||||
|
||||
// 输出或保存
|
||||
if ($savePath) {
|
||||
$result->saveToFile($savePath);
|
||||
return $savePath;
|
||||
}
|
||||
|
||||
header('Content-Type: ' . $result->getMimeType());
|
||||
echo $result->getString();
|
||||
exit;
|
||||
|
||||
} catch (\Exception $e) {
|
||||
throw new \RuntimeException("生成失败: " . $e->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user