PHP实现的创建带logo图标二维码生成类详解

本文实例讲述了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-bestsize二维码尺寸 1-50dest_file生成的二维码图片路径quality生成的图片质量logologo路径,为空表示不加入logologo_sizelogo尺寸,null表示按二维码尺寸比例自动计算logo_outline_sizelogo描边尺寸,null表示按logo尺寸按比自动计算logo_outline_colorlogo描边颜色logo_opacitylogo不透明度 0-100logo_radiuslogo圆角角度 0-30

代码如下:

PHPQRCode.class.PHP

rush:PHP;"> 'H',// 二维码质量 L-smallest,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,$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_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,$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['quality']); break; case 3: imagepng($dest_img,(int)(($this->_config['quality']-1)/10)); break; } // 不需要加入logo }else{ $dest_img = imagecreatefrompng($tmp_qrcode_file); // 生成图片 switch($dest_ext){ case 1: imagegif($dest_img,(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,$bgcolor); // 合拼图片与底图,实现描边效果 imagecopy($bg_img,$img,(int)(($bg_w-$img_w)/2),(int)(($bg_h-$img_h)/2),$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,127); imagefill($new_img,$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,$y,$rgb); // 在图片四角范围,选择画图 }else{ // 上左 $ox = $r; // 圆心x坐标 $oy = $r; // 圆心y坐标 if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) <= ($r*$r) ){ imagesetpixel($new_img,$rgb); } // 上右 $ox = $img_w-$r; // 圆心x坐标 $oy = $r; // 圆心y坐标 if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) <= ($r*$r) ){ imagesetpixel($new_img,$rgb); } // 下左 $ox = $r; // 圆心x坐标 $oy = $img_h-$r; // 圆心y坐标 if( ( ($x-$ox)*($x-$ox) + ($y-$oy)*($y-$oy) ) <= ($r*$r) ){ imagesetpixel($new_img,$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,$rgb); } } } } return $new_img; } // 合拼图片并保留各自透明度 private function imagecopymerge_alpha($dest_img,$src_img,$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,$src_h); imagecopymerge($dest_img,$tmp_img,$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,2)),'g' => hexdec(substr($color,2,'b' => hexdec(substr($color,4,2)) ); } else { $r = substr($color,1) . substr($color,1); $g = substr($color,1,1); $b = substr($color,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

rush:PHP;"> 'H',// L-smallest,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.cc/'; // 创建二维码类 $oPHPQRCode = new PHPQRCode(); // 设定配置 $oPHPQRCode->set_config($config); // 创建二维码 $qrcode = $oPHPQRCode->generate($data); // 显示二维码 echo '

生成二维码图片

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

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

在线生成二维码工具(加强版)

在线二维码解码识别工具

更多关于PHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》、《》、《》、《》及《PHP常见数据库操作技巧汇总》

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


服务器优化必备:深入了解PHP8底层开发原理
Golang的网络编程:如何快速构建高性能的网络应用?
Golang和其他编程语言的对比:为什么它的开发效率更高?
PHP8底层开发原理揭秘:如何利用新特性创建出色的Web应用
将字符重新排列以形成回文(如果可能)在C++中
掌握PHP8底层开发原理和新特性:创建高效可扩展的应用程序
服务器性能优化必学:掌握PHP8底层开发原理
PHP8新特性和底层开发原理详解:优化应用性能的终极指南
将 C/C++ 代码转换为汇编语言
深入研究PHP8底层开发原理:创建高效可扩展的应用程序
C++程序查找法向量和迹
PHP8底层开发原理实战指南:提升服务器效能
重排数组,使得当 i 为偶数时,arr[i] >= arr[j],当 i 为奇数时,arr[i] <= arr[j],其中 j < i,使用 C++ 语言实现
Golang的垃圾回收:为什么它可以减少开发人员的负担?
C++程序:将一个数组的所有元素复制到另一个数组中
Golang:构建智能系统的基石
为什么AI开发者应该关注Golang?
在C和C++中,逗号(comma)的用法是用来分隔表达式或语句
PHP8底层开发原理解析及新特性应用实例
利用PHP8底层开发原理解析新特性:如何构建出色的Web应用