107 lines
4.7 KiB
PHP
107 lines
4.7 KiB
PHP
<?php
|
||
|
||
namespace addons\qrcode\library;
|
||
|
||
use Endroid\QrCode\Builder\Builder;
|
||
use Endroid\QrCode\Color\Color;
|
||
use Endroid\QrCode\Encoding\Encoding;
|
||
use Endroid\QrCode\ErrorCorrectionLevel;
|
||
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
|
||
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;
|
||
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelMedium;
|
||
use Endroid\QrCode\Label\Alignment\LabelAlignmentCenter;
|
||
use Endroid\QrCode\Label\Alignment\LabelAlignmentRight;
|
||
use Endroid\QrCode\Label\Font\Font;
|
||
use Endroid\QrCode\Label\Font\NotoSans;
|
||
use Endroid\QrCode\Label\Label;
|
||
use Endroid\QrCode\Label\Margin\Margin;
|
||
use Endroid\QrCode\Logo\Logo;
|
||
use Endroid\QrCode\QrCode;
|
||
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
|
||
use Endroid\QrCode\Writer\PngWriter;
|
||
use Endroid\QrCode\Writer\Result\ResultInterface;
|
||
use Endroid\QrCode\Writer\SvgWriter;
|
||
|
||
class Service
|
||
{
|
||
/**
|
||
* 生成二维码
|
||
* @param $params
|
||
* @return ResultInterface
|
||
*/
|
||
public static function qrcode($params)
|
||
{
|
||
$config = get_addon_config('qrcode');
|
||
$params = is_array($params) ? $params : [$params];
|
||
$params = array_merge($config, $params);
|
||
|
||
$params['padding'] = intval($params['padding'] ?? $config['padding']);
|
||
|
||
$params['labelfontpath'] = ROOT_PATH . 'public' . $config['labelfontpath'];
|
||
$params['logopath'] = ROOT_PATH . 'public' . $config['logopath'];
|
||
|
||
// 前景色
|
||
list($r, $g, $b) = sscanf($params['foreground'] ?? $config['foreground'], "#%02x%02x%02x");
|
||
$foregroundColor = new Color($r, $g, $b);
|
||
|
||
// 背景色
|
||
list($r, $g, $b) = sscanf($params['background'] ?? $config['background'], "#%02x%02x%02x");
|
||
$backgroundColor = new Color($r, $g, $b);
|
||
|
||
if ($params['label'] ?? '') {
|
||
list($r, $g, $b) = sscanf($params['labelfontcolor'] ?? ($config['labelfontcolor'] ?? '#000000'), "#%02x%02x%02x");
|
||
$labelTextColor = new Color($r, $g, $b);
|
||
|
||
if (isset($params['labelalignment']) && in_array($params['labelalignment'], ['left', 'right', 'center'])) {
|
||
$params['labelalignment'] = ucfirst($params['labelalignment']);
|
||
$className = "\Endroid\QrCode\Label\Alignment\LabelAlignment{$params['labelalignment']}";
|
||
$alignment = new $className();
|
||
}
|
||
//边距:上/右/下/左
|
||
$labelMarginArr = [0, $params['padding'], $params['padding'], $params['padding']];
|
||
if (isset($params['labelmargin'])) {
|
||
$labelmargin = $params['labelmargin'];
|
||
$labelMarginArrTemp = explode(' ', $labelmargin);
|
||
if (count($labelMarginArrTemp) < 4) {
|
||
$labelMarginArr = array_merge($labelMarginArrTemp, array_slice($labelMarginArr, count($labelMarginArrTemp), 4 - count($labelMarginArrTemp)));
|
||
} else {
|
||
$labelMarginArr = $labelMarginArrTemp;
|
||
}
|
||
}
|
||
// 底边距最小2,避免文本被截断
|
||
$labelMarginArr[2] = max(2, $labelMarginArr[2]);
|
||
$label = Label::create($params['label'])
|
||
->setFont(new Font($params['labelfontpath'], $params['labelfontsize']))
|
||
->setAlignment($alignment ?? new LabelAlignmentCenter())
|
||
->setMargin(new Margin(...$labelMarginArr))
|
||
->setTextColor($labelTextColor);
|
||
}
|
||
|
||
// Logo
|
||
if (isset($params['logo']) && $params['logo'] && $params['logopath'] && file_exists($params['logopath'])) {
|
||
$logo = Logo::create($params['logopath'])
|
||
->setResizeToWidth($params['logosize']);
|
||
}
|
||
|
||
if (($params['errorlevel'] ?? '') && in_array($params['errorlevel'], ['low', 'medium', 'quartile', 'high'])) {
|
||
$params['errorlevel'] = ucfirst($params['errorlevel']);
|
||
$className = "\Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevel{$params['errorlevel']}";
|
||
$errorCorrectionLevel = new $className();
|
||
}
|
||
|
||
// 二维码
|
||
$qrcode = QrCode::create($params['text'] ?? $config['text'])
|
||
->setEncoding(new Encoding('UTF-8'))
|
||
->setErrorCorrectionLevel($errorCorrectionLevel ?? new ErrorCorrectionLevelMedium())
|
||
->setSize(intval($params['size'] ?? $config['size']))
|
||
->setMargin($params['padding'])
|
||
->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())
|
||
->setForegroundColor($foregroundColor)
|
||
->setBackgroundColor($backgroundColor);
|
||
|
||
$write = isset($params['format']) && $params['format'] === 'svg' ? new SvgWriter() : new PngWriter();
|
||
$result = $write->write($qrcode, $logo ?? null, $label ?? null, ['exclude_xml_declaration' => true]);
|
||
return $result;
|
||
}
|
||
}
|