修改phpqrcode源码满足添加中间logo图标功能

2023-09-05 16:05:44 浏览数 (1)

qrcode

问题起源

最近尝试了一下用phpqrcode生成二维码的功能,发现没有添加中间logo的功能,于是自己改了源码写了一个功能。百度能搜到的都是在phpqrcode生成文件的基础上二次添加的,这样对于强迫症来说是有一点性能损耗的,因为每次都伴随着文件的生成和读取,于是自己添加了一个直接在原基础上生成带logo的二维码。可选是否生成文件。

使用方法

类库下载地址 :https://github.com/ShyZhen/phpqrcode

代码语言:javascript复制
    require_once '../phpqrcode.php';
    $text = 'https://www.litblc.com';
    $level = 1;
    $size = 10;
    $margin = 1;
    $logo = './logo.png';
    $saveName = false;
    /**
     * 生成中间带有logo的二维码
     * @Author huaixiu.zhen
     * http://litblc.com
     * @param string $text     要生成的url
     * @param int $level       容错率 推荐使用 >= 1 的值
     * @param int $size        控制生成图片的大小
     * @param int $margin      控制生成二维码的空白区域大小
     * @param string $logo     中间要加的logo的物理地址
     * @param string $saveName 是否保存,可以输入路径和文件名
     */
    QRcode::addLogo($text, $level, $size, $margin, $logo, $saveName);

源码解读

代码语言:javascript复制
    /**
     * 生成中间带有logo的二维码
     * @Author huaixiu.zhen
     * http://litblc.com
     * @param string $text 要生成的url
     * @param int $level 容错率 推荐使用 >= 1 的值
     * @param int $size 控制生成图片的大小
     * @param int $margin 控制生成二维码的空白区域大小
     * @param string $logo 中间要加的logo物理地址
     * @param string $saveName 是否保存,可以输入路径和文件名
     */
    public static function addLogo($text, $level, $size, $margin, $logo, $saveName = '')
    {
        // Copyright 2018 litblc, shyZhen
        // May be used under the terms of the GNU Lesser General Public License (LGPL)
        $img = self::png($text, 'resource', $level, $size, $margin, false);
        if (file_exists($logo)) {
            $logo = imagecreatefromstring (file_get_contents($logo));
        } else {
            die('logo file not exists');
        }
        // 真彩色图像转换为调色板图像,防止颜色失真
        if (imageistruecolor($logo)) {
            imagetruecolortopalette($logo, false, 65535);
        }
        $QR_width = imagesx($img);
        $logo_width = imagesx($logo);
        $logo_height = imagesy($logo);
        $logo_qr_width = $QR_width / 5;
        $scale = $logo_width / $logo_qr_width;
        $logo_qr_height = $logo_height / $scale;
        $from_width = ($QR_width - $logo_qr_width) / 2;
        imagecopyresampled($img, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
        header("content-type: image/png");
        if ($saveName) {
            ImagePng($img, $saveName);
            ImagePng($img);
        } else {
            imagepng ($img);
        }
    }

主要是修改源码使之返回图像资源,在图像资源上进行操作。其他部分修改不在这里展示了,缺点是只对生成png格式的二维码方法进行了修改,满足了我大部分的要求。

0 人点赞