利用phpqrcode二維碼生成類庫和imagecopymerge函數制拼接圖片的經驗


前期准備

1、利用phpqrcode生成二維碼:

原理分析:

下載下來的類文件是一個壓縮包,包含很多文件和演示程序,我們只需要里邊的phpqrcode.php

這一個文件就可以生成二維碼了,它是一個多個類的集合文件,我們需要用到里邊的QRcode類png()方法:

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必須傳遞圖片路徑;
     * 
     */

  使用示例:

require_once("./phpqrcode.php");
function creatQrcode(){
    //設置二維碼的鏈接地址
    $url = "http://www.baidu.com";
    //設置二維碼的容錯級別
    /*
     * 容錯級別:容錯級別百分比越高,就越容易識別,容錯級別:
     * 按照效果排序依次是  H -> Q -> M -> L
     */
    $errorCorrectionLevel = 'H';    
    //設置生成二維碼圖片的大小
    $matrixPointSize = 7;
    //設置生成二維碼的圖片名稱(路徑名稱根據項目需求而定)
    $filename = "test.png";
    QRcode::png($url, $filename, $errorCorrectionLevel, $matrixPointSize, 1);
    //以上已經生成了二維碼了(同級目錄下的test.png)
}
creatQrcode();

2、如果要在生成的二維碼中間放置logo的話:

<?php
//引入phpqrcode類庫
require_once("./phpqrcode.php");
function creatQrcode(){
    //設置二維碼的鏈接地址
    $url = "http://www.baidu.com";
    //設置二維碼的容錯級別
    /*
     * 容錯級別:容錯級別百分比越高,就越容易識別,容錯級別:
     * 按照效果排序依次是  H -> Q -> M -> L
     */
    $errorCorrectionLevel = 'H';    
    //設置生成二維碼圖片的大小
    $matrixPointSize = 7;
    //設置生成二維碼的圖片名稱
    $filename = "test.png";
    QRcode::png($url, $filename, $errorCorrectionLevel, $matrixPointSize, 1);
    //以上已經生成了二維碼了(同級目錄下的test.png)
    $logo = './img/logo.png';
    $QR = $filename;
    $QRlogo = './img/qrlogo.png';
    if(file_exists($logo)){
        // 函數:imagecreatefromstring():創建一塊畫布,並從字符串中的圖像流新建一副圖像
        $QR = imagecreatefromstring(file_get_contents($QR));        //目標圖象連接資源。
        $logo = imagecreatefromstring(file_get_contents($logo));     //源圖象連接資源。
        // php函數:imagesx(resource image):獲取圖像寬度
        // PHP函數:imagesy(resource image):獲取圖像高度
        $QR_width = imagesx($QR);
        $QR_height = imagesy($QR);
        $logo_width = imagesx($logo);//logo圖片寬度 
        $logo_height = imagesy($logo);//logo圖片高度 

        $logo_qr_width = $QR_width / 5;   //組合之后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():將一幅圖像中的一塊正方形區域拷貝到另一個圖像中,平滑地插入像素值,因此,尤其是,減小了圖像的大小而仍然保持了極大的清晰度。參數詳解
         *
         * bool imagecopyresampled ( resource $dst_image , resource $src_image , int $dst_x , int $dst_y , int $src_x , int $src_y , int $dst_w , int $dst_h , int $src_w , int $src_h )
         *
         * dst_image 目標圖象連接資源。
         * src_image 源圖象連接資源。
         * dst_x 目標 X 坐標點。
         * dst_y 目標 Y 坐標點。
         * src_x 源的 X 坐標點。
         * src_y 源的 Y 坐標點。
         * dst_w 目標寬度。
         * dst_h 目標高度。
         * src_w 源圖象的寬度。
         * src_h 源圖象的高度。
         */
        imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
        // PHP函數:imagepng ( resource image [, string filename] ):以 PNG 格式將圖像輸出到瀏覽器或文件
        imagepng($QR,$QRlogo);
        echo '<image src="'.$QRlogo.'"/>';
    }
}
creatQrcode();

3、如果加了logo的二維碼要放在一張海報上的話:

imagecopymerge函數制拼合(鑲嵌,合並)圖片 同樣適合水印之類的

<?php
//引入phpqrcode類庫
require_once("./phpqrcode.php");
function creatQrcode(){
    //設置二維碼的鏈接地址
    $url = "http://www.baidu.com";
    //設置二維碼的容錯級別
    /*
     * 容錯級別:容錯級別百分比越高,就越容易識別,容錯級別:
     * 按照效果排序依次是  H -> Q -> M -> L
     */
    $errorCorrectionLevel = 'H';    
    //設置生成二維碼圖片的大小
    $matrixPointSize = 7;
    //設置生成二維碼的圖片名稱
    $filename = "test.png";
    QRcode::png($url, $filename, $errorCorrectionLevel, $matrixPointSize, 1);
    //以上已經生成了二維碼了(同級目錄下的test.png)

    //————————————————————————————————————————————————————————————————
    //二維碼上添加logo
    $logo = './img/logo.png';
    $QR = $filename;
    $QRlogo = './img/qrlogo.png';
    if(file_exists($logo)){
        // 函數:imagecreatefromstring():創建一塊畫布,並從字符串中的圖像流新建一副圖像
        $QR = imagecreatefromstring(file_get_contents($QR));        //目標圖象連接資源。
        $logo = imagecreatefromstring(file_get_contents($logo));     //源圖象連接資源。
        // php函數:imagesx(resource image):獲取圖像寬度
        // PHP函數:imagesy(resource image):獲取圖像高度
        $QR_width = imagesx($QR);
        $QR_height = imagesy($QR);
        $logo_width = imagesx($logo);//logo圖片寬度 
        $logo_height = imagesy($logo);//logo圖片高度 

        $logo_qr_width = $QR_width / 5;   //組合之后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($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width,$logo_qr_height, $logo_width, $logo_height);
        // PHP函數:imagepng ( resource image [, string filename] ):以 PNG 格式將圖像輸出到瀏覽器或文件
        imagepng($QR,$QRlogo);



        //——————————————————————————————————————————
        // 加了logo的二維碼放在海報之類的背景圖上面

        $dst_path = './img/xuexi.jpg';     //底圖
        $src_path = $QRlogo;     //覆蓋圖,我們就繼續用上面的那張圖QRlogo

        //創建圖片實例
        $dst = imagecreatefromstring(file_get_contents($dst_path));
        $src = imagecreatefromstring(file_get_contents($src_path));
        //獲取覆蓋圖的寬高
        list($src_w, $src_h) = getimagesize($src_path);
        /**
         *
         * PHP函數:imagecopymerge()/imagecopy()
         *
         * bool imagecopymerge ( resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h , int $pct )
         * 將 src_im 圖像中坐標從 src_x,src_y 開始,寬度為 src_w,高度為 src_h 的一部分拷貝到 dst_im 圖像中坐標為 dst_x 和 dst_y 的位置上。兩圖像將根據 pct 來決定合並程度,其值范圍從 0 到 100。當 pct = 0 時,實際上什么也沒做,當為 100 時對於調色板圖像本函數和 imagecopy() 完全一樣,它對真彩色圖像實現了 alpha 透明。
         *
         */
        imagecopymerge($dst, $src, 20, 120, 0, 0, $src_w, $src_h, 100);
        list($dst_w, $dst_h) = getimagesize($dst_path);
        imagepng($dst,'./img/aaa.png');
        imagedestroy($dst);
        imagedestroy($src);
    }
}
creatQrcode();

(注:很多參考網上現有的資料,如果有錯誤,歡迎留言指正!)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM