• 企业400电话
  • 网络优化推广
  • AI电话机器人
  • 呼叫中心
  • 全 部 栏 目

    网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    PHP实现的创建带logo图标二维码生成类详解
    POST TIME:2021-10-18 04:57

    本文实例讲述了PHP实现的创建带logo图标二维码生成类。分享给大家供大家参考,具体如下:

    这里介绍php实现创建二维码类,支持设置尺寸,加入LOGO,描边、圆角、透明度,等处理。提供完整代码,演示实例及详细参数说明,方便大家学习使用。

    实现功能如下:

    1.创建二维码
    2.加入logo到二维码中
    3.logo可描边
    4.logo可圆角
    5.logo可设透明度
    6.logo图片及输出图片类型支持png,jpg,gif格式
    7.可设置输出图片质量

    设定参数说明:

    ecc 二维码质量 L-smallest, M, Q, H-best
    size 二维码尺寸 1-50
    dest_file 生成的二维码图片路径
    quality 生成的图片质量
    logo logo路径,为空表示不加入logo
    logo_size logo尺寸,null表示按二维码尺寸比例自动计算
    logo_outline_size logo描边尺寸,null表示按logo尺寸按比例自动计算
    logo_outline_color logo描边颜色
    logo_opacity logo不透明度 0-100
    logo_radius logo圆角角度 0-30

    代码如下:

    PHPQRCode.class.php

    ?php
    require_once dirname(__FILE__)."/qrcode/qrlib.php";
    /**
     * PHP创建二维码类
     * Date:  2018-03-18
     * Author: fdipzone
     * Version: 1.0
     *
     * Description:
     * PHP实现创建二维码类,支持设置尺寸,加入LOGO,圆角,透明度,等处理。
     *
     * Func:
     * public set_config      设定配置
     * public generate       创建二维码
     * private create_qrcode    创建纯二维码图片
     * private add_logo       合拼纯二维码图片与logo图片
     * private image_outline    图片对象进行描边
     * private image_fillet     图片对象进行圆角处理
     * private imagecopymerge_alpha 合拼图片并保留各自透明度
     * private create_dirs     创建目录
     * private hex2rgb       hex颜色转rgb颜色
     * private get_file_ext     获取图片类型
     */
    class PHPQRCode{ // class start
      /** 默认设定 */
      private $_config = array(
        'ecc' => 'H',            // 二维码质量 L-smallest, M, Q, H-best
        'size' => 15,            // 二维码尺寸 1-50
        'dest_file' => 'qrcode.png',    // 创建的二维码路径
        'quality' => 100,          // 图片质量
        'logo' => '',            // logo路径,为空表示没有logo
        'logo_size' => null,        // logo尺寸,null表示按二维码尺寸比例自动计算
        'logo_outline_size' => null,    // logo描边尺寸,null表示按logo尺寸按比例自动计算
        'logo_outline_color' => '#FFFFFF', // logo描边颜色
        'logo_opacity' => 100,       // logo不透明度 0-100
        'logo_radius' => 0,         // logo圆角角度 0-30
      );
      /**
       * 设定配置
       * @param Array  $config 配置内容
       */
      public function set_config($config){
        // 允许设定的配置
        $config_keys = array_keys($this->_config);
        // 获取传入的配置,写入设定
        foreach($config_keys as $k=>$v){
          if(isset($config[$v])){
            $this->_config[$v] = $config[$v];
          }
        }
      }
      /**
       * 创建二维码
       * @param String $data 二维码内容
       * @return String
       */
      public function generate($data){
        // 创建临时二维码图片
        $tmp_qrcode_file = $this->create_qrcode($data);
        // 合拼临时二维码图片与logo图片
        $this->add_logo($tmp_qrcode_file);
        // 删除临时二维码图片
        if($tmp_qrcode_file!=''  file_exists($tmp_qrcode_file)){
          unlink($tmp_qrcode_file);
        }
        return file_exists($this->_config['dest_file'])? $this->_config['dest_file'] : '';
      }
      /**
       * 创建临时二维码图片
       * @param String $data 二维码内容
       * @return String
       */
      private function create_qrcode($data){
        // 临时二维码图片
        $tmp_qrcode_file = dirname(__FILE__).'/tmp_qrcode_'.time().mt_rand(100,999).'.png';
        // 创建临时二维码
        QRcode::png($data, $tmp_qrcode_file, $this->_config['ecc'], $this->_config['size'], 2);
        // 返回临时二维码路径
        return file_exists($tmp_qrcode_file)? $tmp_qrcode_file : '';
      }
      /**
       * 合拼临时二维码图片与logo图片
       * @param String $tmp_qrcode_file 临时二维码图片
       */
      private function add_logo($tmp_qrcode_file){
        // 创建目标文件夹
        $this->create_dirs(dirname($this->_config['dest_file']));
        // 获取目标图片的类型
        $dest_ext = $this->get_file_ext($this->_config['dest_file']);
        // 需要加入logo
        if(file_exists($this->_config['logo'])){
          // 创建临时二维码图片对象
          $tmp_qrcode_img = imagecreatefrompng($tmp_qrcode_file);
          // 获取临时二维码图片尺寸
          list($qrcode_w, $qrcode_h, $qrcode_type) = getimagesize($tmp_qrcode_file);
          // 获取logo图片尺寸及类型
          list($logo_w, $logo_h, $logo_type) = getimagesize($this->_config['logo']);
          // 创建logo图片对象
          switch($logo_type){ 
            case 1: $logo_img = imagecreatefromgif($this->_config['logo']); break; 
            case 2: $logo_img = imagecreatefromjpeg($this->_config['logo']); break; 
            case 3: $logo_img = imagecreatefrompng($this->_config['logo']); break; 
            default: return ''; 
          }
          // 设定logo图片合拼尺寸,没有设定则按比例自动计算
          $new_logo_w = isset($this->_config['logo_size'])? $this->_config['logo_size'] : (int)($qrcode_w/5);
          $new_logo_h = isset($this->_config['logo_size'])? $this->_config['logo_size'] : (int)($qrcode_h/5);
          // 按设定尺寸调整logo图片
          $new_logo_img = imagecreatetruecolor($new_logo_w, $new_logo_h);
          imagecopyresampled($new_logo_img, $logo_img, 0, 0, 0, 0, $new_logo_w, $new_logo_h, $logo_w, $logo_h);
          // 判断是否需要描边
          if(!isset($this->_config['logo_outline_size']) || $this->_config['logo_outline_size']>0){
            list($new_logo_img, $new_logo_w, $new_logo_h) = $this->image_outline($new_logo_img);
          }
          // 判断是否需要圆角处理
          if($this->_config['logo_radius']>0){
            $new_logo_img = $this->image_fillet($new_logo_img);
          }
          // 合拼logo与临时二维码
          $pos_x = ($qrcode_w-$new_logo_w)/2;
          $pos_y = ($qrcode_h-$new_logo_h)/2;
          imagealphablending($tmp_qrcode_img, true);
          // 合拼图片并保留各自透明度
          $dest_img = $this->imagecopymerge_alpha($tmp_qrcode_img, $new_logo_img, $pos_x, $pos_y, 0, 0, $new_logo_w, $new_logo_h, $this->_config['logo_opacity']);
          // 生成图片
          switch($dest_ext){
            case 1: imagegif($dest_img, $this->_config['dest_file'], $this->_config['quality']); break;
            case 2: imagejpeg($dest_img, $this->_config['dest_file'], $this->_config['quality']); break;
            case 3: imagepng($dest_img, $this->_config['dest_file'], (int)(($this->_config['quality']-1)/10)); break;
          } 
        // 不需要加入logo
        }else{
          $dest_img = imagecreatefrompng($tmp_qrcode_file);
          // 生成图片
          switch($dest_ext){
            case 1: imagegif($dest_img, $this->_config['dest_file'], $this->_config['quality']); break;
            case 2: imagejpeg($dest_img, $this->_config['dest_file'], $this->_config['quality']); break;
            case 3: imagepng($dest_img, $this->_config['dest_file'], (int)(($this->_config['quality']-1)/10)); break;
          }
        }
      }
      /**
       * 对图片对象进行描边
       * @param Obj  $img 图片对象
       * @return Array
       */
      private function image_outline($img){
        // 获取图片宽高
        $img_w = imagesx($img);
        $img_h = imagesy($img);
        // 计算描边尺寸,没有设定则按比例自动计算
        $bg_w = isset($this->_config['logo_outline_size'])? intval($img_w + $this->_config['logo_outline_size']) : $img_w + (int)($img_w/5);
        $bg_h = isset($this->_config['logo_outline_size'])? intval($img_h + $this->_config['logo_outline_size']) : $img_h + (int)($img_h/5);
        // 创建底图对象
        $bg_img = imagecreatetruecolor($bg_w, $bg_h);
        // 设置底图颜色
        $rgb = $this->hex2rgb($this->_config['logo_outline_color']);
        $bgcolor = imagecolorallocate($bg_img, $rgb['r'], $rgb['g'], $rgb['b']);
        // 填充底图颜色
        imagefill($bg_img, 0, 0, $bgcolor);
        // 合拼图片与底图,实现描边效果
        imagecopy($bg_img, $img, (int)(($bg_w-$img_w)/2), (int)(($bg_h-$img_h)/2), 0, 0, $img_w, $img_h);
        $img = $bg_img;
        return array($img, $bg_w, $bg_h);
      }
      /**
       * 对图片对象进行圆角处理
       * @param Obj $img 图片对象
       * @return Obj
       */
      private function image_fillet($img){
        // 获取图片宽高
        $img_w = imagesx($img);
        $img_h = imagesy($img);
        // 创建圆角图片对象
        $new_img = imagecreatetruecolor($img_w, $img_h);
        // 保存透明通道
        imagesavealpha($new_img, true);
        // 填充圆角图片
        $bg = imagecolorallocatealpha($new_img, 255, 255, 255, 127);
        imagefill($new_img, 0, 0, $bg);
        // 圆角半径
        $r = $this->_config['logo_radius'];
        // 执行圆角处理
        for($x=0; $x$img_w; $x++){
          for($y=0; $y$img_h; $y++){
            $rgb = imagecolorat($img, $x, $y);
            // 不在图片四角范围,直接画图
            if(($x>=$r  $x=($img_w-$r)) || ($y>=$r  $y=($img_h-$r))){
              imagesetpixel($new_img, $x, $y, $rgb);
            // 在图片四角范围,选择画图
            }else{
              // 上左
              $ox = $r; // 圆心x坐标
              $oy = $r; // 圆心y坐标
              if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) = ($r*$r) ){
                imagesetpixel($new_img, $x, $y, $rgb);
              }
              // 上右
              $ox = $img_w-$r; // 圆心x坐标
              $oy = $r;    // 圆心y坐标
              if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) = ($r*$r) ){
                imagesetpixel($new_img, $x, $y, $rgb);
              }
              // 下左
              $ox = $r;    // 圆心x坐标
              $oy = $img_h-$r; // 圆心y坐标
              if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) = ($r*$r) ){
                imagesetpixel($new_img, $x, $y, $rgb);
              }
              // 下右
              $ox = $img_w-$r; // 圆心x坐标
              $oy = $img_h-$r; // 圆心y坐标
              if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) = ($r*$r) ){
                imagesetpixel($new_img, $x, $y, $rgb);
              }
            }
          }
        }
        return $new_img;
      }
      // 合拼图片并保留各自透明度
      private function imagecopymerge_alpha($dest_img, $src_img, $pos_x, $pos_y, $src_x, $src_y, $src_w, $src_h, $opacity){
        $w = imagesx($src_img);
        $h = imagesy($src_img);
        $tmp_img = imagecreatetruecolor($src_w, $src_h);
        imagecopy($tmp_img, $dest_img, 0, 0, $pos_x, $pos_y, $src_w, $src_h);
        imagecopy($tmp_img, $src_img, 0, 0, $src_x, $src_y, $src_w, $src_h);
        imagecopymerge($dest_img, $tmp_img, $pos_x, $pos_y, $src_x, $src_y, $src_w, $src_h, $opacity);
        return $dest_img;
      }
      /**
       * 创建目录
       * @param String $path
       * @return Boolean
       */
      private function create_dirs($path){
        if(!is_dir($path)){
          return mkdir($path, 0777, true);
        }
        return true;
      }
      /** hex颜色转rgb颜色
       * @param String $color hex颜色
       * @return Array
       */
      private function hex2rgb($hexcolor){
        $color = str_replace('#', '', $hexcolor);
        if (strlen($color) > 3) {
          $rgb = array(
            'r' => hexdec(substr($color, 0, 2)),
            'g' => hexdec(substr($color, 2, 2)),
            'b' => hexdec(substr($color, 4, 2))
          );
        } else {
          $r = substr($color, 0, 1) . substr($color, 0, 1);
          $g = substr($color, 1, 1) . substr($color, 1, 1);
          $b = substr($color, 2, 1) . substr($color, 2, 1);
          $rgb = array(
            'r' => hexdec($r),
            'g' => hexdec($g),
            'b' => hexdec($b)
          );
        }
        return $rgb;
      }
      /** 获取图片类型 
       * @param String $file 图片路径 
       * @return int 
       */ 
      private function get_file_ext($file){
        $filename = basename($file);
        list($name, $ext)= explode('.', $filename);
        $ext_type = 0;
        switch(strtolower($ext)){
          case 'jpg':
          case 'jpeg':
            $ext_type = 2;
            break;
          case 'gif':
            $ext_type = 1;
            break;
          case 'png':
            $ext_type = 3;
            break;
        }
        return $ext_type;
      }
    } // class end
    ?>
    
    

    demo.php

    ?php
    require 'PHPQRCode.class.php';
    $config = array(
        'ecc' => 'H',  // L-smallest, M, Q, H-best
        'size' => 12,  // 1-50
        'dest_file' => 'qrcode.png',
        'quality' => 90,
        'logo' => 'logo.jpg',
        'logo_size' => 100,
        'logo_outline_size' => 20,
        'logo_outline_color' => '#FFFF00',
        'logo_radius' => 15,
        'logo_opacity' => 100,
    );
    // 二维码内容
    $data = 'https://www.jb51.net/';
    // 创建二维码类
    $oPHPQRCode = new PHPQRCode();
    // 设定配置
    $oPHPQRCode->set_config($config);
    // 创建二维码
    $qrcode = $oPHPQRCode->generate($data);
    // 显示二维码
    echo 'img src="'.$qrcode.'?t='.time().'">';
    ?>
    
    

    生成的二维码图片:

    源码下载地址:点击此处本站下载

    PS:这里再为大家推荐两款二维码相关在线工具供大家参考使用:

    在线生成二维码工具(加强版)
    http://tools.jb51.net/transcoding/jb51qrcode

    在线二维码解码识别工具
    http://tools.jb51.net/transcoding/trans_qrcode

    更多关于PHP相关内容感兴趣的读者可查看本站专题:《PHP图形与图片操作技巧汇总》、《PHP数组(Array)操作技巧大全》、《PHP数据结构与算法教程》、《php程序设计算法总结》、《PHP数学运算技巧总结》、《php字符串(string)用法总结》及《php常见数据库操作技巧汇总》

    希望本文所述对大家PHP程序设计有所帮助。

    您可能感兴趣的文章:
    • PHP生成二维码与识别二维码的方法详解【附源码下载】
    • PHP生成(支持多模板)二维码海报代码
    • PHP基于phpqrcode类生成二维码的方法详解
    • php实现生成带二维码图片并强制下载功能
    • 微信小程序 PHP生成带参数二维码
    • php生成二维码图片方法汇总
    • php微信高级接口调用方法(自定义菜单接口、客服接口、二维码)
    • php+laravel 扫码二维码签到功能
    上一篇:PHP实现的生成唯一RequestID类完整示例
    下一篇:TP5 基于bootstrap实现多图上传插件
  • 相关文章
  • 

    关于我们 | 付款方式 | 荣誉资质 | 业务提交 | 代理合作


    © 2016-2020 巨人网络通讯

    时间:9:00-21:00 (节假日不休)

    地址:江苏信息产业基地11号楼四层

    《增值电信业务经营许可证》 苏B2-20120278

    X

    截屏,微信识别二维码

    微信号:veteran88

    (点击微信号复制,添加好友)

     打开微信