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;
 | 
						||
    }
 | 
						||
}
 |