Blogger Information
Blog 43
fans 2
comment 2
visits 113230
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
thinkphp5.1生成二维码并解决logo失真
朝游东海
Original
4043 people have browsed it

先上结果 :二维码加上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



Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post