使用PHP生成二维码的两种方法(带logo图像)


Posted in PHP onMarch 14, 2014

一、利用Google API生成二维码
 Google提供了较为完善的二维码生成接口,调用API接口很简单,以下是调用代码:

$urlToEncode="https://3water.com"; 
generateQRfromGoogle($urlToEncode); 
/** 
 * google api 二维码生成【QRcode可以存储最多4296个字母数字类型的任意文本,具体可以查看二维码数据格式】 
 * @param string $chl 二维码包含的信息,可以是数字、字符、二进制信息、汉字。 
 不能混合数据类型,数据必须经过UTF-8 URL-encoded 
 * @param int $widhtHeight 生成二维码的尺寸设置 
 * @param string $EC_level 可选纠错级别,QR码支持四个等级纠错,用来恢复丢失的、读错的、模糊的、数据。 
 * L-默认:可以识别已损失的7%的数据 
 * M-可以识别已损失15%的数据 
 * Q-可以识别已损失25%的数据 
 * H-可以识别已损失30%的数据 
 * @param int $margin 生成的二维码离图片边框的距离 
 */ 
function generateQRfromGoogle($chl,$widhtHeight ='150',$EC_level='L',$margin='0') 
{ 
 $chl = urlencode($chl); 
 echo '<img src="http://chart.apis.google.com/chart?chs='.$widhtHeight.'x'.$widhtHeight.' 
 &cht=qr&chld='.$EC_level.'|'.$margin.'&chl='.$chl.'" alt="QR code" widhtHeight="'.$widhtHeight.' 
 " widhtHeight="'.$widhtHeight.'"/>'; 
}

二、使用PHP二维码生成类库PHP QR Code生成二维码
 
PHP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码,官网提供了下载和多个演示demo,查看地址:http://phpqrcode.sourceforge.net/。
下载官网提供的类库后,只需要使用phpqrcode.php就可以生成二维码了,当然您的PHP环境必须开启支持GD2。 phpqrcode.php提供了一个关键的png()方法,其中参数$text表示生成二位的的信息文本;参数$outfile表示是否输出二维码图片 文件,默认否;参数$level表示容错率,也就是有被覆盖的区域还能识别,分别是 L(QR_ECLEVEL_L,7%),M(QR_ECLEVEL_M,15%),Q(QR_ECLEVEL_Q,25%),H(QR_ECLEVEL_H,30%); 参数$size表示生成图片大小,默认是3;参数$margin表示二维码周围边框空白区域间距值;参数$saveandprint表示是否保存二维码并 显示。

public static function png($text, $outfile=false, $level=QR_ECLEVEL_L, $size=3, $margin=4, 
$saveandprint=false) 
{ 
 $enc = QRencode::factory($level, $size, $margin); 
 return $enc->encodePNG($text, $outfile, $saveandprint=false); 
}

调用PHP QR Code非常简单,如下代码即可生成一张内容为"https://3water.com"的二维码.
Php代码 
include 'phpqrcode.php';  
QRcode::png('https://3water.com');  
 
那么实际应用中,我们会在二维码的中间加上自己的LOGO,已增强宣传效果。那如何生成含有logo的二维码呢?其实原理很简单,先使用PHP QR Code生成一张二维码图片,然后再利用php的image相关函数,将事先准备好的logo图片加入到刚生成的原始二维码图片中间,然后重新生成一张新 的二维码图片。

include 'phpqrcode.php'; 
$value = 'https://3water.com'; //二维码内容 
$errorCorrectionLevel = 'L';//容错级别 
$matrixPointSize = 6;//生成图片大小 
//生成二维码图片 
QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2); 
$logo = 'logo.png';//准备好的logo图片 
$QR = 'qrcode.png';//已经生成的原始二维码图 
 
if ($logo !== 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图片宽度 
 $logo_height = imagesy($logo);//logo图片高度 
 $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) / 2; 
 //重新组合图片并调整大小 
 imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, 
 $logo_qr_height, $logo_width, $logo_height); 
} 
//输出图片 
imagepng($QR, 'helloweba.png'); 
echo '<img src="helloweba.png">';

下面是参考上面的代码,不生产图片文件,方便调用的,将下面的代码保存为img.php

<?php
include 'phpqrcode.php'; 
$value = $_GET['url'];//二维码内容 
$errorCorrectionLevel = 'L';//容错级别 
$matrixPointSize = 6;//生成图片大小 
//生成二维码图片 
QRcode::png($value, 'qrcode.png', $errorCorrectionLevel, $matrixPointSize, 2); 
$logo = '3water.png';//准备好的logo图片 
$QR = 'qrcode.png';//已经生成的原始二维码图 

if ($logo !== 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图片宽度 
 $logo_height = imagesy($logo);//logo图片高度 
 $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) / 2; 
 //重新组合图片并调整大小 
 imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, 
 $logo_qr_height, $logo_width, $logo_height); 
} 
//输出图片 
Header("Content-type: image/png");
ImagePng($QR);

调用方法:

<img src=http://test.3water.com:8080/qr/img.php?url=https://3water.com/1.rar>

由于二维码允许有一定的容错性,一般的二维码即使在遮住部分但仍然能够解码,经常我们扫描二维码的时候扫描到甚至不到一半时就能解码扫描结果,这是因为生成器会将部分信息重复表示来提高其容错度,这就是为什么我们在二维码中间加个LOGO图片并不影响解码结果的原因。
 

PS:本站还提供了一个功能十分强大的二维码工具供大家使用:

PHP 相关文章推荐
php 无限级缓存的类的扩展
Mar 16 PHP
PHP写MySQL数据 实现代码
Jun 15 PHP
php页面函数设置超时限制的方法
Dec 01 PHP
memcache一致性hash的php实现方法
Mar 05 PHP
PHP 使用redis简单示例分享
Mar 05 PHP
使用图灵api创建微信聊天机器人
Jul 23 PHP
PHP中的use关键字及文件的加载详解
Nov 28 PHP
PHP微信分享开发详解
Jan 14 PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 PHP
Laravel框架基于ajax和layer.js实现无刷新删除功能示例
Jan 17 PHP
解决laravel 出现ajax请求419(unknown status)的问题
Sep 03 PHP
Laravel的Auth验证Token验证使用自定义Redis的例子
Sep 30 PHP
19个超实用的PHP代码片段
Mar 14 #PHP
php的zip解压缩类pclzip使用示例
Mar 14 #PHP
php多功能图片处理类分享(php图片缩放类)
Mar 14 #PHP
zf框架db类的分页示例分享
Mar 14 #PHP
zf框架的db类select查询器join链表使用示例(zend框架)
Mar 14 #PHP
zf框架的zend_cache缓存使用方法(zend框架)
Mar 14 #PHP
php实现天干地支计算器示例
Mar 14 #PHP
You might like
php 中文和编码判断代码
2010/05/16 PHP
详解js异步文件加载器
2016/01/24 PHP
CI框架中$this-&gt;load-&gt;library()用法分析
2016/05/18 PHP
Linux下 php7安装redis的方法
2018/11/01 PHP
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
2011/01/08 Javascript
Javascript实现关联数据(Linked Data)查询及注意细节
2013/02/22 Javascript
jquery实现网页查找功能示例分享
2014/02/12 Javascript
jQuery中document与window以及load与ready 区别详解
2014/12/29 Javascript
jQuery检测鼠标左键和右键点击的方法
2015/03/17 Javascript
JavaScript实现的伸展收缩型菜单代码
2015/10/14 Javascript
jQuery插件实现适用于移动端的地址选择器
2016/02/18 Javascript
mvc中form表单提交的三种方式(推荐)
2016/08/10 Javascript
jQuery内存泄露解决办法
2016/12/13 Javascript
JS点击动态添加标签、删除指定标签的代码
2018/04/18 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
[03:17]DOTA2-DPC中国联赛1月29日Recap集锦
2021/03/11 DOTA
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
3个用于数据科学的顶级Python库
2018/09/29 Python
python脚本当作Linux中的服务启动实现方法
2019/06/28 Python
django框架模型层功能、组成与用法分析
2019/07/30 Python
详谈tensorflow gfile文件的用法
2020/02/05 Python
北美最大的零售退货翻新商:VIP Outlet
2019/11/21 全球购物
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
啤酒销售实习自我鉴定
2013/09/24 职场文书
幼教毕业生自我鉴定
2014/01/12 职场文书
医药个人求职信范文
2014/01/29 职场文书
研究生给导师的自荐信
2015/03/06 职场文书
2015年国税春训心得体会
2015/03/09 职场文书
春晚观后感
2015/06/11 职场文书
2016年国庆节新闻稿范文
2015/11/25 职场文书
送给小学生的暑假礼物!小学生必背99首古诗
2019/07/02 职场文书
写作指导:怎么书写竞聘演讲稿?
2019/07/04 职场文书
JAVA SpringMVC实现自定义拦截器
2022/03/16 Python
详解Python中__new__方法的作用
2022/03/31 Python