最新 PHP qr-code

http://sourceforge.net/projects/phpqrcode/

phpqrcode好久没有更新,qr-code是另一个扩展,作者在维护
安装:
composer require endroid/qr-code
使用:

  1. use Endroid\QrCode\QrCode;
  2. // $content 一般为url地址 当然也可以是文字内容
  3. $content = 'http://www.baidu.com?rand=' . rand(1000, 9999);
  4. $qrCode = new QrCode($content);
  5. // 指定内容类型
  6. header('Content-Type: '.$qrCode->getContentType());
  7. // 输出二维码
  8. echo $qrCode->writeString();

存入文件:
$qrCode->writeFile(DIR . ‘/qrcode.png’);


详细:

  1. <?
  2. use '命名空间';
  3. $qr_url = 'http://www.baidu.com?id=' . rand(1000, 9999);
  4. $file_name = '/tmp';
  5. // 直接输出
  6. $qr_code = new QrcodeComponent();
  7. $qr_img = qr_code->create($qr_url);
  8. echo $qr_img;
  9. // 生成文件
  10. $config = [
  11. 'generate' => 'writefile',
  12. ];
  13. $qr_code = new QrcodeComponent($config);
  14. $qr_img = $qr_code->create($qr_url);
  15. $rs = $qr_code->generateImg($file_name);
  16. print_r($rs);

常用参数解释:
setSize - 二维码大小 px
setWriterByName - 写入文件的后缀名
setMargin - 二维码内容相对于整张图片的外边距
setEncoding - 编码类型
setErrorCorrectionLevel - 容错等级,分为L、M、Q、H四级
setForegroundColor - 前景色
setBackgroundColor - 背景色
setLabel - 二维码标签
setLogoPath - 二维码logo路径
setLogoWidth - 二维码logo大小 px

1.google开放api

https://github.com/zxing/zxing
https://github.com/dsiddharth2/php-zxing php 版本
代码如下:

<?
$urlToEncode="http://www.helloweba.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.'"/>'; 
}

2.php类库PHP QR Code

最新版是2010年的。
地址:http://phpqrcode.sourceforge.net/
下载:http://sourceforge.net/projects/phpqrcode/
下载官网提供的类库后,只需要使用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:

include 'phpqrcode.php'; 
QRcode::png('http://www.helloweba.com');

实际应用中,我们会在二维码的中间加上自己的LOGO,已增强宣传效果。那如何生成含有logo的二维码呢?
其实原理很简单,先使用PHP QR Code生成一张二维码图片,然后再利用php的image相关函数,将事先准备好的logo图片加入到刚生成的原始二维码图片中间,然后重新生成一张新的二维码图片。

<?
include 'phpqrcode.php';  
$value = 'http://www.helloweba.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">';


对于第二种方法:如果不使用$filename,第二个参数为false的时候,就不会把二维码图片保存,而是直接输出。
现在还有一些如有:libqrencode与QRcode Perl CGI & PHP scripts二维码生成插件大家喜欢也可看看。

3.基于jquery的二维码生成插件qrcode

在页面中调用该插件就能生成对应的二维码。
qrcode其实是通过使用jQuery实现图形渲染,画图,支持canvas(HTML5)和table两种方式,
可以到https://github.com/jeromeetienne/jquery-qrcode获取最新的代码。
如何使用
(1)、首先在页面中加入jquery库文件和qrcode插件。

(2)、在页面中需要显示二维码的地方加入以下代码:


(3)、调用qrcode插件。
qrcode支持canvas和table两种方式进行图片渲染,默认使用canvas方式,效率最高,当然要浏览器支持html5。直接调用如下:
$(‘#code’).qrcode(“http://www.helloweba.com“); //任意字符串
您也可以通过以下方式调用:

$("#code").qrcode({ 
    render: "table", //table方式 
    width: 200, //宽度 
    height:200, //高度 
    text: "www.helloweba.com" //任意内容 });


这样就可以在页面中直接生成一个二维码,你可以用手机“扫一扫”功能读取二维码信息。
(4).识别中文
我们试验的时候发现不能识别中文内容的二维码,通过查找多方资料了解到,jquery-qrcode是采用charCodeAt()方式进行编码转换的。而这个方法默认会获取它的Unicode编码,如果有中文内容,在生成二维码前就要把字符串转换成UTF-8,然后再生成二维码。您可以通过以下函数来转换中文字符串:

function toUtf8(str) {    
    var out, i, len, c;    
    out = "";    
    len = str.length;    
    for(i = 0; i < len; i++) {    
        c = str.charCodeAt(i);    
        if ((c >= 0x0001) && (c <= 0x007F)) {    
            out += str.charAt(i);    
        } else if (c > 0x07FF) {    
            out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));    
            out += String.fromCharCode(0x80 | ((c >>  6) & 0x3F));    
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));    
        } else {    
            out += String.fromCharCode(0xC0 | ((c >>  6) & 0x1F));    
            out += String.fromCharCode(0x80 | ((c >>  0) & 0x3F));    
        }    
    }    
    return out;    }

以下示例:

var str = toUtf8("普罗旺斯没有故事"); 
$('#code').qrcode(str);



laravel中使用:
https://xueyuanjun.com/post/2605.html?page=1#comments

phpqrcode类生成二维码详解



使用PHP语言生成二维码,还是挺有难度的,当然调用生成二维码图片的接口(比如:联图网http://www.liantu.com/的接口)除外,如果自己写代码生成,真的无从下手。然而,我们可以使用phpqrcode这个现成的类文件,PHP二维码生成类库,利用它可以轻松生成二维码。
前期准备:
1.phpqrcode类文件下载,下载地址:https://sourceforge.net/projects/phpqrcode/
2.PHP环境必须开启支持GD2扩展库支持(一般情况下都是开启状态)
方法解读:
下载下来的类文件是一个压缩包,里边包含很多文件和演示程序,我们只需要里边的phpqrcode.php这一个文件就可以生成二维码了。它是一个多个类的集合文件,我们需要用到里边的QRcode类(第2963行)的png()方法(第3090行):

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


第1个参数$text:二维码包含的内容,可以是链接、文字、json字符串等等;
第2个参数$outfile:默认为false,不生成文件,只将二维码图片返回输出;否则需要给出存放生成二维码图片的文件名及路径;
第3个参数$level:默认为L,这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%),这个参数控制二维码容错率,不同的参数表示二维码可被覆盖的区域百分比,也就是被覆盖的区域还能识别;
第4个参数$size:控制生成图片的大小,默认为4;
第5个参数$margin:控制生成二维码的空白区域大小;
第6个参数$saveandprint:保存二维码图片并显示出来,$outfile必须传递图片路径;

使用示例
1. 生成二维码(生成图片文件)

<?
// 1. 生成原始的二维码(生成图片文件)
function scerweima($url=''){
  require_once 'phpqrcode.php';
  $value = $url;         //二维码内容
  $errorCorrectionLevel = 'L';  //容错级别
  $matrixPointSize = 5;      //生成图片大小
  //生成二维码图片
  $filename = 'qrcode/'.microtime().'.png';
  QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
  $QR = $filename;        //已经生成的原始二维码图片文件
  $QR = imagecreatefromstring(file_get_contents($QR));
  //输出图片
  imagepng($QR, 'qrcode.png');
  imagedestroy($QR);
  return '<img src="qrcode.png" alt="使用微信扫描支付">';
}
//调用查看结果
echo scerweima('https://www.baidu.com');


2. 在生成的二维码中加上logo(生成图片文件)

<?
//2. 在生成的二维码中加上logo(生成图片文件)
function scerweima1($url=''){
  require_once 'phpqrcode.php';
  $value = $url;         //二维码内容
  $errorCorrectionLevel = 'H';  //容错级别
  $matrixPointSize = 6;      //生成图片大小
  //生成二维码图片
  $filename = 'qrcode/'.microtime().'.png';
  QRcode::png($value,$filename , $errorCorrectionLevel, $matrixPointSize, 2);
  $logo = 'qrcode/logo.jpg'; //准备好的logo图片
  $QR = $filename;      //已经生成的原始二维码图
  if (file_exists($logo)) {
    $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 / 4;   //组合之后logo的宽度(占二维码的1/5)
    $scale = $logo_width/$logo_qr_width;  //logo的宽度缩放比(本身宽度/组合后的宽度)
    $logo_qr_height = $logo_height/$scale; //组合之后logo的高度
    $from_width = ($QR_width - $logo_qr_width) / 2;  //组合之后logo左上角所在坐标点
    //重新组合图片并调整大小
    /*
     * imagecopyresampled() 将一幅图像(源图象)中的一块正方形区域拷贝到另一个图像中
     */
    imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
  }
  //输出图片
  imagepng($QR, 'qrcode.png');
  imagedestroy($QR);
  imagedestroy($logo);
  return '<img src="qrcode.png" alt="使用微信扫描支付">';
}
//调用查看结果
echo scerweima1('https://www.baidu.com');


3. 生成二维码(不生成图片文件)

<?
//3. 生成原始的二维码(不生成图片文件)
function scerweima2($url=''){
  require_once 'phpqrcode.php';
  $value = $url;         //二维码内容
  $errorCorrectionLevel = 'L';  //容错级别
  $matrixPointSize = 5;      //生成图片大小
  //生成二维码图片
  $QR = QRcode::png($value,false,$errorCorrectionLevel, $matrixPointSize, 2);
}
//调用查看结果
scerweima2('https://www.baidu.com');

前两种方法,每调用一次都会在本地生成一张二维码图片,第三种方法,不生成文件,会直接输出二维码到浏览器中。

直接引用无需编码方式

可使用curl远程下载图片到本地。
通过api的方式需要依赖api的稳定性。把二维码类文件下载到本地使用更加稳定。

草料二维码

https://cli.im/api
不用编码,直接写参数即可。
调整URL参数中的二维码内容和美化模板id,即可直接打开你专属的二维码下载页面 查看案例
https://cli.im/api/qrcode/code?text=二维码内容&mhid=美化模板id
https://cli.im/api/qrcode/code?text=//cli.im&mhid=sELPDFnok80gPHovKdI

联图二维码

https://www.liantu.com/pingtai/
实例
二维码 - 图1
上面的实例在页面直接显示了一张二维码图片。
这张二维码图片的包含了参数背景颜色(bg)、前景颜色(fg)、渐变颜色(gc)、纠错等级(el)、图片宽度(w)、外边距(m)。

l 可以使用二维码 - 图2进行引用
l 2下载图片 http://qr.liantu.com/api.php?text=x 进行引用
l 3直接引用网址 http://qr.liantu.com/api.php?text=x
x 必须用UTF8编码格式,x内容出现 & 符号时,请用 %26 代替,
换行符使用 %0A
引用参数
以下参数可用于引用二维码图片时定义图片样式
参数引用例子:http://qr.liantu.com/api.php?&bg=ffffff&fg=cc0000&text=x

参数 描述 赋值例子
bg 背景颜色 bg=颜色代码,例如:bg=ffffff
fg 前景颜色 fg=颜色代码,例如:fg=cc0000
gc 渐变颜色 gc=颜色代码,例如:gc=cc00000
el 纠错等级 el可用值:h\q\m\l,例如:el=h
w 尺寸大小 w=数值(像素),例如:w=300
m 静区(外边距) m=数值(像素),例如:m=30
pt 定位点颜色(外框) pt=颜色代码,例如:pt=00ff00
inpt 定位点颜色(内点) inpt=颜色代码,例如:inpt=000000
logo logo图片 logo=图片地址,例如:logo=http://www.liantu.com/images/2013/sample.jpg