You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel使用simple-QRcode设置圆形定位眼后眼球仍为方形的问题

Laravel中Simple-QRcode生成全圆形定位眼二维码的解决方案

使用Simple-QRcode包生成二维码时,调用eye('circle')仅能修改定位眼的外框为圆形,内部眼球仍为方形,无法达到内外全圆的效果。

当前使用的生成代码:

QrCode::size(200)
        ->eye('circle')
        ->style('round')
        ->format('png')
        ->generate('Example', public_path('test.png'));

实际生成效果:
实际生成的二维码(外圆内方)

期望实现效果:
期望的二维码(外圆内圆)


解决方案

Simple-QRcode依赖的endroid/qr-code库中,默认的EyeCircle类仅绘制圆形外框,内部仍使用方形填充。要实现全圆形定位眼,需要自定义眼的绘制逻辑:

步骤1:创建自定义圆形眼类

在项目中创建自定义眼类,继承默认的EyeCircle并重写绘制方法,替换内部方形填充为圆形:

<?php

namespace App\QrCode;

use Endroid\QrCode\Eye\EyeCircle;
use Endroid\QrCode\Renderer\Path\Path;
use Endroid\QrCode\Renderer\RendererInterface;

class CustomCircleEye extends EyeCircle
{
    public function draw(RendererInterface $renderer, int $size): void
    {
        // 绘制外圆环(保留原有逻辑)
        $outerPath = new Path();
        $outerPath->addCircle($size / 2, $size / 2, $size / 2);
        $outerPath->addCircle($size / 2, $size / 2, $size / 2 * 0.7);
        $outerPath->setOperation(Path::OPERATION_DIFFERENCE);
        $renderer->drawPath($outerPath);

        // 绘制内部实心圆(替换原方形填充)
        $innerPath = new Path();
        $innerPath->addCircle($size / 2, $size / 2, $size / 2 * 0.4);
        $renderer->drawPath($innerPath);
    }
}

步骤2:使用自定义眼生成二维码

在生成逻辑中调用customEye方法,传入自定义眼类的实例:

use App\QrCode\CustomCircleEye;
use SimpleSoftwareIO\QrCode\Facades\QrCode;

QrCode::size(200)
    ->customEye(new CustomCircleEye())
    ->style('round')
    ->format('png')
    ->generate('Example', public_path('test.png'));

补充说明

  • 确保项目依赖的endroid/qr-code版本≥4.0,否则可能不支持自定义眼接口;
  • 可调整代码中0.7、0.4等比例参数,修改外圆环宽度和内部圆的大小,适配不同视觉需求。

内容的提问来源于stack exchange,提问作者Rizwan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 16:20:14