使用PHP生成带LOGO的二维码

使用PHP生成带LOGO的二维码
code1.jpg

HP QR Code是一个PHP二维码生成类库,利用它可以轻松生成二维码。下载官网提供的类库后,只需要使用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); 
}  

一、生成不带LOGO的二维码图片

调用PHP QR Code非常简单,如下代码即可生成一张内容为"http://www.kfazcenter.com/"的二维码。

代码如下:

public function qrcode($url='http://www.kfazcenter.com/',$level=3,$size=4){
    Vendor('phpqrcode.phpqrcode');
    $errorCorrectionLevel =intval($level) ;//容错级别 
    $matrixPointSize = intval($size);//生成图片大小 
    //生成二维码图片 
    //echo $_SERVER['REQUEST_URI'];
    $object = new \QRcode();
    $object->png($url, false, $errorCorrectionLevel, $matrixPointSize, 2); 
}

到这里已经可以生成二维码了;如果想对二维码更加个性化定制的话下面具体说一下png() 函数的使用。

png(
    $text, $outfile = false, 
    $level = QR_ECLEVEL_L, 
    $size = 3, 
    $margin = 4, 
    $saveandprint=false, 
    $back_color = 0xFFFFFF, 
    $fore_color = 0x000000
   );  

① 第一个参数$text:就是上面代码里的URL网址参数;
② 第二个参数$outfile:默认为否;不生成文件;只将二维码图片返回;否则需要给出存放生成二维码图片的路径;
③ 第三个参数$level:默认为L;这个参数可传递的值分别是L(QR_ECLEVEL_L,7%)、M(QR_ECLEVEL_M,15%)、Q(QR_ECLEVEL_Q,25%)、H(QR_ECLEVEL_H,30%);这个参数控制二维码容错率;不同的参数表示二维码可被覆盖的区域百分比。利用二维维码的容错率;我们可以将头像放置在生成的二维码图片任何区域;
④ 第四个参数$size:控制生成图片的大小;默认为4;
⑤ 第五个参数$margin:控制生成二维码的空白区域大小;
⑥ 第六个参数$saveandprint:保存二维码图片并显示出来;$outfile必须传递图片路径;
⑦ 第七个参数$back_color:背景颜色;
⑧ 第八个参数$fore_color:绘制二维码的颜色;
注:第七、第八个参数需要传16进制是色值;并且要把“#”替换为“0x”
例如:
白色:#FFFFFF => 0xFFFFFF
黑色:#000000 => 0x000000

二、生成带LOGO的二维码图片

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

代码如下:

  /**      
    * 生成带logo的二维码图片      
    */  
    public function qrcodeWithPicture()  
    {  
        Vendor('phpqrcode.phpqrcode');  
        $object = new \QRcode();  
        //二维码内容  
        $url = 'http://www.kfazcenter.com';  
        //容错级别  
        $errorCorrectionLevel = 'L';  
        //生成图片大小  
        $matrixPointSize = 6;  
        //生成一个二维码图片  
        $object->png($url, 'zhihua_w.png', $errorCorrectionLevel, $matrixPointSize, 2);  
  
        //准备好的logo图片,本人放在了根目录下  
        $logo = "a1.jpg";  
        //已经生成的原始二维码图,也在根目录下  
        $qrcode = 'zhihua_w.png';  
        //logo图片存在  
        if ($logo !== FALSE) {  
            $qrcode = imagecreatefromstring(file_get_contents($qrcode));  
            $logo = imagecreatefromstring(file_get_contents($logo));  
            $qrcode_width = imagesx($qrcode);   //二维码图片宽度  
            $qrcode_height = imagesy($qrcode);  //二维码图片高度  
            $logo_width = imagesx($logo);       //logo图片宽度  
            $logo_height = imagesy($logo);      //logo图片高度  
            $logo_qr_width = $qrcode_width / 5;  
            $scale = $logo_width / $logo_qr_width;  
            $logo_qr_height = $logo_height / $scale;  
            $from_width = ($qrcode_width - $logo_qr_width) / 2;  
            //重新组合图片并调整大小  
            imagecopyresampled($qrcode, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,  
            $logo_qr_height, $logo_width, $logo_height);  
        }  
        //输出图片  
        imagepng($qrcode, 'zhihua_w_logo.png');  
        echo '<img src="http://www.kfazcenter.com/zhihua_w_logo.png">';  
    } 

三、利用Google API生成二维码

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

补充说明:

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

如果你有更好的心得和建议,欢迎拍砖一起探讨。
欢迎加入【编程技术微分享】,加入(596888158)请留言,或联系QQ:Mr.Chen(1182929304)。