博客列表 >thinkphp5.1生成二维码并解决logo失真

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

朝游东海
朝游东海原创
2019年02月21日 13:43:054044浏览

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

5855451.png

实现:

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


结果:

585545.png

出现了问题:

中间的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掉,否则会输出图片二进制流

    }
}


结果:

5855451.png

解决了logo失真的问题

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



声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议