欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

thinkphp5.1生成二维码并解决logo失真

程序员文章站 2022-03-06 13:21:39
...

先上结果 :二维码加上logo,并logo不失真

thinkphp5.1生成二维码并解决logo失真

实现:

用composer添加扩展phpqrcode

引用

use PHPQRCode\QRcode;

代码:

 /*** 生成二维码
   @param str $text 生成二维码的内容
   @param str $path 保存路径  ==false 只显示,不保存到本地路径
   @param str $level = "L";        // 容错级别  level 控制二维码容错率,默认为L,范围:L、M、Q、H
   @param number $size = 10;  // 生成图片大小
   @param number $margin = 2;         // 边距
   @param str   $saveandprint = false //不明:qrcode.php生成所需
   @param str  $logo 设置显示在二维码中间的图地址
   @param number $from_width 二维码的偏移
      参考文档 https://blog.csdn.net/s371795639/article/details/53518724
  *****/
public function createQrcode($param = []){
    if(empty($param['text'])){
        return false;
    }
    $text = $param['text'];
    $path = $param['path'] ? App::getRootPath().$param['path']  : false;
    $level = $param['level'] ?: 'L';
    $size  = $param['size'] ?: 3;
    $margin = $param['margin'] ?: 4;
    $saveandprint = $param['saveandprint'] ?: false;
    $logo = $param['logo'];
    //设置中间图
    $logo_qr_width = $param['logo_qr_width']?:5;
    $from_width = $param['from_width'] ?: 2;

    $qrcode = new QRcode();
    $qrcode->png($text, $path, $level, $size, $margin, $saveandprint);

    if(empty($logo)){
        exit;
    }
    //判断是否有中间图
    $QR = $path;     //已经生成的原始二维码图
    if(file_exists(@$logo) && $path !== false){
        $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
        $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
 
        $QR_width = imagesx($QR);
        $QR_height = imagesy($QR);
        $logo_width = imagesx($logo);
        $logo_height = imagesy($logo);
        $logo_qr_width = $QR_width / $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)  / $from_width;   // / 2;
        imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
        imagepng($QR, $path);
        @header("Content-type: image/png");
        imagepng($QR);
        imagedestroy($QR);
        imagedestroy($logo);
        die;    // tp5里输出图片在最后必须die掉,否则会输出图片二进制流

    }
}

调用

  //创建二维码
  public function createqr(){
$code = 5855451;
   $data = [
       'text'=>'https://www.bilibili.com/video/av10360081',
          'path'=>'public/uploads/qrcode/'.$code.'.png',
          'level'=>'Q',
          'size'=>6,
          'margin'=>1,
          //'logo'=> App::getRootPath().'public/uploads/avatar/oXAn10DtGNKDz421q_ATefmwAgrI.jpg',
          'logo'=> App::getRootPath().'public/uploads/qrcode/logo1.png',
          'logo_qr_width' => 3,
      ];
      Utils::createQrcode($data);
  }


结果:

thinkphp5.1生成二维码并解决logo失真

出现了问题:

中间的logo失真特别厉害

解决方法

public function createQrcode($param = []){
    if(empty($param['text'])){
        return false;
    }
    $text = $param['text'];
    $path = $param['path'] ? App::getRootPath().$param['path']  : false;
    $level = $param['level'] ?: 'L';
    $size  = $param['size'] ?: 3;
    $margin = $param['margin'] ?: 4;
    $saveandprint = $param['saveandprint'] ?: false;
    $logo = $param['logo'];
    //设置中间图
    $logo_qr_width = $param['logo_qr_width']?:5;
    $from_width = $param['from_width'] ?: 2;

    $qrcode = new QRcode();
    $qrcode->png($text, $path, $level, $size, $margin, $saveandprint);

    if(empty($logo)){
        exit;
    }
    //判断是否有中间图
    $QR = $path;     //已经生成的原始二维码图
    if(file_exists(@$logo) && $path !== false){
        $QR = imagecreatefromstring(file_get_contents($QR)); //目标图象连接资源。
        $logo = imagecreatefromstring(file_get_contents($logo)); //源图象连接资源。
        if (imageistruecolor($logo)) { //添加
            imagetruecolortopalette($logo, false, 65535);//添加这行代码来解决颜色失真问题
        }
        $QR_width = imagesx($QR);
        $QR_height = imagesy($QR);
        $logo_width = imagesx($logo);
        $logo_height = imagesy($logo);
        $logo_qr_width = $QR_width / $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)  / $from_width;   // / 2;
        imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
        imagepng($QR, $path);
        @header("Content-type: image/png");
        imagepng($QR);
        imagedestroy($QR);
        imagedestroy($logo);
        die;    // tp5里输出图片在最后必须die掉,否则会输出图片二进制流

    }
}


结果:

thinkphp5.1生成二维码并解决logo失真

解决了logo失真的问题

参考文档:https://blog.csdn.net/s371795639/article/details/53518724