首页 > 编程语言 >PHP利用endroid/qr-code生成个性二维码

PHP利用endroid/qr-code生成个性二维码

时间:2024-09-21 15:50:22浏览次数:7  
标签:code endroid detail qrImage qr file path label

需先安装拓展库

composer require endroid/qr-code


use Endroid\QrCode\Color\Color;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelHigh;
use Endroid\QrCode\QrCode;
use Endroid\QrCode\Label\Label;
use Endroid\QrCode\Logo\Logo;
use Endroid\QrCode\RoundBlockSizeMode\RoundBlockSizeModeMargin;
use Endroid\QrCode\Writer\PngWriter;

/**
     * @notes: myGenerateQrCode
     * @param $code_detail
     * @return array
     */
    public function myGenerateQrCode($code_detail)
    {
        /*$code_detail = [
            'qr_code_text'             => 'qr code text',
            'qr_code_margin'           => 10,
            'logo_path'                => '/static/assets/images/logo.jpg',
            'label_text'               => 'Label Text',
            'label_text_color'         => [0, 0, 0]
        ];*/
        if (!isset($code_detail['label_text_color'])) {
            $code_detail['label_text_color'] = [0, 0, 0];
        }
        try {
            $writer = new PngWriter();
            // Create QR code
            $qrCode = QrCode::create(strval($code_detail['qr_code_text']))
                ->setEncoding(new Encoding('UTF-8'))
                ->setErrorCorrectionLevel(new ErrorCorrectionLevelHigh())
                ->setSize(640)
                ->setMargin(20)
                ->setRoundBlockSizeMode(new RoundBlockSizeModeMargin())
                ->setForegroundColor(new Color(0, 0, 0))
                ->setBackgroundColor(new Color(255, 255, 255));
            // Create generic logo
            if (isset($code_detail['logo_path'])) {
                $logo = Logo::create('.' . $code_detail['logo_path'])->setResizeToWidth(128);
            } else {
                $logo = null;
            }
            // Create generic label
            if (isset($code_detail['label_text'])) {
                $label = Label::create(strval($code_detail['label_text']))
                    ->setTextColor(new Color($code_detail['label_text_color'][0], $code_detail['label_text_color'][1], $code_detail['label_text_color'][2]));
            } else {
                $label = null;
            }
            $result      = $writer->write($qrCode, $logo, $label);
            $folder_path = '/storage/qr_code/';
            $file_name   = get_now_date('YmdHis') . bin2hex(random_bytes(8));
            $file_path   = $folder_path . $file_name . '.png';
            // 如果需要修改定位标
            // $this->myGenerateQrCodeLocator($file_path);
            // 如果需要渐变色
            // $this->myGenerateQrCodeGradient($file_path);
            $result->saveToFile('.' . $file_path);
            return [
                'code'      => 200,
                'media_url' => $folder_path . $file_name . '.png',
                'media_uri' => get_file_url($file_path)
            ];
        } catch (\Exception $e) {
            return [
                'code' => 500,
                'msg'  => $e->getMessage()
            ];
        }
    }

    /**
     * @notes: 二维码菱形定位标
     * @param $file_path
     * @return void
     */
    public function myGenerateQrCodeLocator($file_path)
    {
        // 加载二维码图像
        $qrImage = imagecreatefrompng('.' . $file_path);
        $width   = imagesx($qrImage);
        $height  = imagesy($qrImage);
        // 自定义定位标志的颜色
        $circleBorderColor = imagecolorallocate($qrImage, 255, 255, 255); // 圆圈边框颜色(黑色)
        $circleFillColor   = imagecolorallocate($qrImage, 0, 0, 0);       // 圆圈填充颜色(白色)
        $diamondColor      = imagecolorallocate($qrImage, 0, 0, 0);       // 菱形颜色(黑色)
        $squareColor       = imagecolorallocate($qrImage, 255, 255, 255); // 正方形颜色(红色)
        // 绘制自定义定位标志
        function drawMarker($image, $x, $y, $circleBorderColor, $circleFillColor, $diamondColor, $squareColor)
        {
            imageantialias($image, true);
            // 绘制正方形
            imagefilledrectangle($image, $x - 90, $y - 90, $x + 90, $y + 90, $squareColor);
            // 绘制圆圈填充
            imagefilledellipse($image, $x, $y, 160, 160, $circleFillColor);   // 增加直径
            // 绘制圆圈边框
            imagefilledellipse($image, $x, $y, 100, 100, $circleBorderColor); // 增加直径
            // 绘制菱形
            $diamondPoints = [
                $x, $y - 30, // 上
                $x + 30, $y, // 右
                $x, $y + 30, // 下
                $x - 30, $y  // 左
            ];
            imagefilledpolygon($image, $diamondPoints, 4, $diamondColor);
        }

        // 定位标志的位置
        $markerPositions = [
            [105, 105],           // 左上角
            [105, $height - 135], // 左下角
            [$width - 105, 105]   // 右上角
        ];
        // 绘制定位标志
        foreach ($markerPositions as $position) {
            drawMarker($qrImage, $position[0], $position[1], $circleBorderColor, $circleFillColor, $diamondColor, $squareColor);
        }
        // 保存最终带自定义定位标志的二维码
        imagepng($qrImage, '.' . $file_path, 9);
        // 清理内存
        imagedestroy($qrImage);
    }

    /**
     * @notes: 二维码渐变颜色
     * @param $file_path
     * @return void
     */
    public function myGenerateQrCodeGradient($file_path)
    {
        // 加载二维码图像
        $qrImage = imagecreatefrompng('.' . $file_path);
        $width   = imagesx($qrImage);
        $height  = imagesy($qrImage);
        // 创建空白图像
        $gradientImage = imagecreatetruecolor($width, $height);
        // 创建渐变色
        for ($y = 0; $y < $height; $y++) {
            $r     = (int)(255 * ($y / $height));  // 红色渐变
            $g     = 0;
            $b     = (int)(255 * (1 - $y / $height));  // 蓝色渐变
            $color = imagecolorallocate($gradientImage, $r, $g, $b);
            imageline($gradientImage, 0, $y, $width, $y, $color);
        }
        // 合成渐变背景和二维码
        for ($x = 0; $x < $width; $x++) {
            for ($y = 0; $y < $height; $y++) {
                $pixelColor = imagecolorat($qrImage, $x, $y);
                $rgba       = imagecolorsforindex($qrImage, $pixelColor);
                // 如果是黑色,则替换为渐变色
                if ($rgba['red'] == 0 && $rgba['green'] == 0 && $rgba['blue'] == 0) {
                    $colorAtGradient = imagecolorat($gradientImage, $x, $y);
                    imagesetpixel($qrImage, $x, $y, $colorAtGradient);
                }
            }
        }
        // 保存最终带渐变色的二维码
        imagepng($qrImage, '.' . $file_path);
        // 清理内存
        imagedestroy($qrImage);
        imagedestroy($gradientImage);
    }

  

标签:code,endroid,detail,qrImage,qr,file,path,label
From: https://www.cnblogs.com/shemmor/p/18424121

相关文章

  • Leetcode 406. 根据身高重建队列
    1.题目基本信息1.1.题目描述假设有打乱顺序的一群人站成一个队列,数组people表示队列中一些人的属性(不一定按顺序)。每个people[i]=[h_i,k_i]表示第i个人的身高为h_i,前面正好有k_i个身高大于或等于h_i的人。请你重新构造并返回输入数组people所表示的队列。返......
  • Leetcode 378. 有序矩阵中第 K 小的元素
    1.题目基本信息1.1.题目描述给你一个nxn矩阵matrix,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个不同的元素。你必须找到一个内存复杂度优于O(n^2)的解决方案。1.2.题目地址https://leetcode.cn/problem......
  • Leecode 最大子数组和
    思路1:先了解前缀和的概念,  ,这题的答案可以转换为:将前缀和pre数组的下标作为x,下标对应的值作为y,建立坐标系得到一条pre折线,找到折现所有最小值与最大值差值最大的(最小值在前最大值在后)值就是本题的答案,也是与买卖股票最佳时机思路一样了思路2:对于以nums[j]元素为结尾的最大......
  • Leecode 滑动窗口最大值
     使用了双向链表输入:nums=[1,3,-1,-3,5,3,6,7],和k=3输出:[3,3,5,5,6,7]解释过程中队列中都是具体的值,方便理解,具体见代码。初始状态:L=R=0,队列:{}i=0,nums[0]=1。队列为空,直接加入。队列:{1}i=1,nums[1]=3。队尾值为1,3>1,弹出队尾值,加入3。队列:{3}i=2,nums[......
  • (LeetCode 热题 100) 199. 二叉树的右视图(递归、深度优先搜索dfs)
    199.二叉树的右视图思路:递归每次都优先右边子树,然后才是左子树。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}......
  • Transformer模型-7- Decoder
    概述Decoder也是N=6层堆叠的结构,每层被分3层:两个注意力层和前馈网络层,同Encoder一样在主层后都加有Add&Norm,负责残差连接和归一化操作。Encoder与Decoder有三大主要的不同:第一层MaskedMulti-HeadAttention:采用Masked操作第二层Multi-HeadAttention:K,V矩阵是......
  • vscode常用配置
    {"workbench.tree.indent":24,"workbench.colorCustomizations":{"editorLineNumber.activeForeground":"#9e3c2da2","editor.lineHighlightBorder":"#74423a77"},&qu......
  • [leetcode刷题]面试经典150题之3删除有序数组中的重复项(简单)
    题目 删除有序数组中的重复项给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。考虑 nums 的唯一元素的数量为 k ,你......
  • LeetCode 876
    题目:LeetCode876解法一:快慢指针注意:while循环条件,以链表(1,2,3,4,null)为例:当条件为fast!=null&&fast.next!=null时,若链表元素为偶数个,则返回中间的后一个节点(3)当条件为fast.next!=null&&fast.next.next!=null时,若链表元素为偶数个,则返回中间的前一个节......
  • [leetcode刷题]面试经典150题之5多数元素元素(简单)【附Boyer-Moore 投票算法(摩尔投票法
    很有意思的一个题,想了半天没想出来,最后发现两行代码就做出来了。写完后学习到还可以用Boyer-Moore投票算法,能减小空间复杂度,我把它写在后面,可以进一步学习。题目  多数元素给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊......