首頁  >  文章  >  後端開發  >  php 二維碼生成

php 二維碼生成

WBOY
WBOY原創
2016-08-08 09:32:411506瀏覽

產生二維碼,有好幾種方法,最快捷的方法就是使用Google的api。可惜Google被牆,很多時候都不好使。現在說一種比較好用的方法。

詳細的文檔和程式碼,請移步http://phpqrcode.sourceforge.net/。

下面是精簡版,根據寫入的訊息,自動產生二維碼。並且儲存到指定的目錄。

主程式碼

		<?php
       
		include "./phpqrcode/qrcode.php";   //导入主文件 
	    $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.&#39;qrcode&#39;.DIRECTORY_SEPARATOR;//文件保存目录
    	$PNG_WEB_DIR = &#39;qrcode/&#39;;//用于预览
    	if (!file_exists($PNG_TEMP_DIR))
        	mkdir($PNG_TEMP_DIR);
        $data = "test";//二维码写入内容
        
        $errorCorrectionLevel = &#39;L&#39;;//错误处理级别
        
        $matrixPointSize = 6;//二维码尺寸大小
        //md5加密生成文件名,data可以使用数据库id或者其他唯一标识符
        $filename = $PNG_TEMP_DIR.md5($data.&#39;|&#39;.$errorCorrectionLevel.&#39;|&#39;.$matrixPointSize).&#39;.png&#39;;
        //使用QRcode类生成二维码,文件保存在PNG_TEMP_DIR下
        QRcode::png($data, $filename, $errorCorrectionLevel, $matrixPointSize, 2); 
        //图片预览
         echo &#39;<img src="&#39;.$PNG_WEB_DIR.basename($filename).&#39;" /><hr/>';  
        ?>

不能加上附件,這是逼我貼上下面的程式碼啊。 。 。把下面這長程式碼,複製到新檔案中,命名為qrcode.php.運行上面的程式碼就能產生二維碼了。 。 。 。

貼兩張產生的二維碼


php類別檔案(來自於http://phpqrcode.sourceforge.net/)

<?php /*
 * PHP二維碼編碼器
 *
 * 該檔案包含 PHP QR 碼庫的合併版本。
 * 為了您的方便,它是從完整版本自動產生的。
 *
 * 此合併版本配置為不需要任何外部文件,
 * 停用快取、錯誤記錄和較弱但更快的遮罩匹配。
 * 如果您需要調整,請使用非合併版本。
 *
 * 如需完整版本、文件、使用範例,請造訪:
 *
 * http://phpqrcode.sourceforge.net/
 * https://sourceforge.net/projects/phpqrcode/
 *
 * PHP QR 碼依照 LGPL 3 分發
 * 版權所有 (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 該庫是免費軟體;您可以重新分發它和/或
 * 根據 GNU Lesser General Public 條款進行修改
 * 自由軟體基金會發布的許可證;任何一個
 * 許可證版本 3 或任何更高版本。
 *
 * 這個函式庫的發布是為了希望它有用,
 * 但不提供任何保證;甚至沒有默示保證
 * 適銷性或特定用途的適用性。參見 GNU
 * 較寬鬆的通用公共授權以了解更多詳細資訊。
 *
 * 您應該已收到 GNU Lesser General Public 的副本
 * 與該庫一起獲得許可;如果沒有,請寫信給自由軟體
 * Foundation, Inc.,51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */
 
 

/*
 * 版本:1.1.4
 * 內部版本:2010100721
 */



//---- qrconst.php -----------------------------





/*
 * PHP二維碼編碼器
 *
 * 常用常數
 *
 * 基於在 LGPL 2.1 下分發的 libqrencode C 庫
 * 版權所有 (C) 2006、2007、2008、2009 福地健太郎 <fukuchi>
 *
 * PHP QR 碼依照 LGPL 3 分發
 * 版權所有 (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 該庫是免費軟體;您可以重新分發它和/或
 * 根據 GNU Lesser General Public 條款進行修改
 * 自由軟體基金會發布的許可證;任何一個
 * 許可證版本 3 或任何更高版本。
 *
 * 這個函式庫的發布是為了希望它有用,
 * 但不提供任何保證;甚至沒有默示保證
 * 適銷性或特定用途的適用性。參見 GNU
 * 較寬鬆的通用公共授權以了解更多詳細資訊。
 *
 * 您應該已收到 GNU Lesser General Public 的副本
 * 與該庫一起獲得許可;如果沒有,請寫信給自由軟體
 * Foundation, Inc.,51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */
 
// 編碼模式
	 
定義('QR_MODE_NUL',-1);
定義('QR_MODE_NUM',0);
定義('QR_MODE_AN',1);
定義('QR_MODE_8', 2);
定義('QR_MODE_KANJI', 3);
定義('QR_MODE_STRUCTURE', 4);

// 糾錯等級。

定義('QR_ECLEVEL_L', 0);
定義('QR_ECLEVEL_M', 1);
定義('QR_ECLEVEL_Q', 2);
定義('QR_ECLEVEL_H', 3);
	
// 支援的輸出格式
	
定義('QR_FORMAT_TEXT',0);
定義('QR_FORMAT_PNG', 1);
	
類別 qrstr {
公共靜態函數集(&$srctab,$x,$y,$repl,$replLen = false){
$srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false) ?$replLen:strlen($repl));
}
}//---- merged_config.php -----------------------------




/*
 * PHP二維碼編碼器
 *
 * 設定文件,針對合併版本進行調整
 */
     
    定義('QR_CACHEABLE',假); // 使用快取 - 更多的磁碟讀取,但更少的 CPU 能力,掩碼和格式模板儲存在那裡
    定義('QR_CACHE_DIR', false); // 當 QR_CACHEABLE === true 時使用
    定義('QR_LOG_DIR',假); // 預設錯誤日誌目錄
    
    定義('QR_FIND_BEST_MASK',true); // 如果為 true,則估計最佳掩碼(規範。預設值,但速度極慢;設定為 false 可以顯著提高效能,但(可能)品質最差的程式碼
    定義('QR_FIND_FROM_RANDOM', 2); // 如果為 false,則檢查所有可用的掩碼,否則值告訴需要檢查的掩碼數量,掩碼 ID 是隨機取得的
    定義('QR_DEFAULT_MASK',2); // 當 QR_FIND_BEST_MASK === false 時
                                                  
    定義('QR_PNG_MAXIMUM_SIZE',1024); // 允許的最大 png 影像寬度(以像素為單位),進行調整以確保 GD 和 PHP 可以處理如此大的影像
                                                  



//---- qrtools.php -----------------------------




/*
 * PHP二維碼編碼器
 *
 * 工具集,方便的調試實用程式。
 *
 * PHP QR 碼依照 LGPL 3 分發
 * 版權所有 (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 該庫是免費軟體;您可以重新分發它和/或
 * 根據 GNU Lesser General Public 條款進行修改
 * 自由軟體基金會發布的許可證;任何一個
 * 許可證版本 3 或任何更高版本。
 *
 * 這個函式庫的發布是為了希望它有用,
 * 但不提供任何保證;甚至沒有默示保證
 * 適銷性或特定用途的適用性。參見 GNU
 * 較寬鬆的通用公共授權以了解更多詳細資訊。
 *
 * 您應該已收到 GNU Lesser General Public 的副本
 * 與該庫一起獲得許可;如果沒有,請寫信給自由軟體
 * Foundation, Inc.,51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

    類別 QRtools {
    
        //------------------------------------------------ ----------------------
        公共靜態函數二值化($frame)
        {
            $len = 計數($frame);
            foreach ($frame as &$frameLine) {
                
                for($i=0; $i 1){
                $eccLevel = $mode[1];
            }
                
            $qrTab = QRcode::text($code, false, $eccLevel);
            $大小=計數($qrTab);
                
            $barcode_array['num_rows'] = $size;
            $barcode_array['num_cols'] = $size;
            $barcode_array['bcode'] = array();
                
            foreach ($qrTab as $line) {
                $arrAdd = 數組();
                foreach(str_split($line) as $char)
                    $arrAdd[] = ($char=='1')?1:0;
                $barcode_array['bcode'][] = $arrAdd;
            }
                    
            返回$barcode_array;
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數clearCache()
        {
            self::$frames = array();
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數 buildCache()
        {
QRtools::markTime('before_build_cache');
			
$mask = 新QRmask();
            for ($a=1; $a makeMaskNo($maskNo, $width, $frame, $bitMask, true);
            }QRtools::markTime('after_build_cache');
        }

        //------------------------------------------------ ----------------------
        公共靜態函數日誌($outfile,$err)
        {
            如果(QR_LOG_DIR!==假){
                if ($err!= '') {
                    if ($outfile !== false) {
                        file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
                    } 別的 {
                        file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
                    }
                }
            }
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數 dumpMask($frame)
        {
            $寬度=計數($frame);
            for($y=0;$y
                    <thead>
<tr style="border-bottom:1px 純銀"><td colspan="2" style="text-align:center">BENCHMARK</td></tr>
                    ';

            foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {
                如果($p>0){
                    echo '<tr> 直到 '.$markerId.': <td>'.number_format($thisTime-$lastTime, 6)。 's</td>
</tr>';
                } 別的 {
                    $startTime = $thisTime;
                }
                
                $p++;
                $上次時間 = $這次時間;
            }
            
            echo '</thead>
<tfoot>
                <tr style="border-top:2px Solid black">
<th style="text-align:right">總計:</th>
<td>'.number_format($lastTime-$startTime , 6).'s </td>
</tr>
            腳>
            表>';
        }
        
    }//#################################################################################################################### ## ###########################
    
    QRtools::markTime('開始');
    



//---- qrspec.php -----------------------------




/*
 * PHP二維碼編碼器
 *
 * 二維碼規格
 *
 * 基於在 LGPL 2.1 下分發的 libqrencode C 庫
 * 版權所有 (C) 2006、2007、2008、2009 福地健太郎 <fukuchi>
 *
 * PHP QR 碼依照 LGPL 3 分發
 * 版權所有 (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 以下數據/規格取自
 *「二維符號-QR碼-基本規範」(JIS X0510:2004)
 * 或者
 *《自動辨識與資料擷取技術—
 * QR Code 2005 條碼符號規範」(ISO/IEC 18004:2006)
 *
 * 該庫是免費軟體;您可以重新分發它和/或
 * 根據 GNU Lesser General Public 條款進行修改
 * 自由軟體基金會發布的許可證;任何一個
 * 許可證版本 3 或任何更高版本。
 *
 * 這個函式庫的發布是為了希望它有用,
 * 但不提供任何保證;甚至沒有默示保證
 * 適銷性或特定用途的適用性。參見 GNU
 * 較寬鬆的通用公共授權以了解更多詳細資訊。
 *
 * 您應該已收到 GNU Lesser General Public 的副本
 * 與該庫一起獲得許可;如果沒有,請寫信給自由軟體
 * Foundation, Inc.,51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */
 
    定義('QRSPEC_VERSION_MAX', 40);
    定義('QRSPEC_WIDTH_MAX',177);

    定義('QRCAP_WIDTH',0);
    定義('QRCAP_WORDS',1);
    定義('QRCAP_REMINDER',2);
    定義('QRCAP_EC', 3);

    類別 QRspec {
    
        公共靜態$容量=數組(
            數組( 0, 0, 0, 數組( 0, 0, 0, 0)),
            數組( 21, 26, 0, 數組( 7, 10, 13, 17)), // 1
            數組( 25, 44, 7, 數組( 10, 16, 22, 28)),
            數組( 29, 70, 7, 數組( 15, 26, 36, 44)),
            數組( 33, 100, 7, 數組( 20, 36, 52, 64)),
            數組( 37, 134, 7, 數組( 26, 48, 72, 88)), // 5
            數組( 41, 172, 7, 數組( 36, 64, 96, 112)),
            數組( 45, 196, 0, 數組( 40, 72, 108, 130)),
            數組( 49, 242, 0, 數組( 48, 88, 132, 156)),
            數組( 53, 292, 0, 數組( 60, 110, 160, 192)),
            數組( 57, 346, 0, 數組( 72, 130, 192, 224)), //10
            數組( 61, 404, 0, 數組( 80, 150, 224, 264)),
            數組( 65, 466, 0, 數組( 96, 176, 260, 308)),
            數組( 69, 532, 0, 數組( 104, 198, 288, 352)),
            數組( 73, 581, 3, 數組( 120, 216, 320, 384)),
            數組( 77, 655, 3, 數組( 132, 240, 360, 432)), //15
            數組( 81, 733, 3, 數組( 144, 280, 408, 480)),
            數組( 85, 815, 3, 數組( 168, 308, 448, 532)),
            數組( 89, 901, 3, 數組( 180, 338, 504, 588)),
            數組( 93, 991, 3, 數組( 196, 364, 546, 650)),
            數組( 97, 1085, 3, 數組( 224, 416, 600, 700)), //20
            數組(101, 1156, 4, 數組(224, 442, 644, 750)),
            數組(105, 1258, 4, 數組(252, 476, 690, 816)),
            數組(109, 1364, 4, 數組(270, 504, 750, 900)),
            數組(113, 1474, 4, 數組( 300, 560, 810, 960)),
            數組(117, 1588, 4, 數組( 312, 588, 870, 1050)), //25
            數組(121, 1706, 4, 數組( 336, 644, 952, 1110)),
            數組(125, 1828, 4, 數組( 360, 700, 1020, 1200)),
            數組(129, 1921, 3, 數組( 390, 728, 1050, 1260)),
            數組(133, 2051, 3, 數組(420, 784, 1140, 1350)),
            數組(137, 2185, 3, 數組( 450, 812, 1200, 1440)), //30
            數組(141, 2323, 3, 數組(480, 868, 1290, 1530)),
            數組(145, 2465, 3, 數組(510, 924, 1350, 1620)),
            數組(149, 2611, 3, 數組(540, 980, 1440, 1710)),
            數組(153, 2761, 3, 數組(570, 1036, 1530, 1800)),
            數組(157, 2876, 0, 數組(570, 1064, 1590, 1890)), //35
            數組(161, 3034, 0, 數組(600, 1120, 1680, 1980)),
            數組(165, 3196, 0, 數組(630, 1204, 1770, 2100)),
            數組(169, 3362, 0, 數組(660, 1260, 1860, 2220)),
            數組(173, 3532, 0, 數組(720, 1316, 1950, 2310)),
            數組(177, 3706, 0, 數組( 750, 1372, 2040, 2430)) //40
        );
        
        //------------------------------------------------ ----------------------
        公用靜態函數 getDataLength($version, $level)
        {
            返回 self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];
        }//------------------------------------------------ ----------------------
        公共靜態函數 getECCLength($version, $level)
        {
            返回自我::$容量[$版本][QRCAP_EC][$等級];
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數 getWidth($version)
        {
            返回自我::$容量[$版本][QRCAP_WIDTH];
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數 getRemainder($version)
        {
            返回自我::$容量[$版本][QRCAP_REMINDER];
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數 getMinimumVersion($size, $level)
        {

            for($i=1; $i= $size)
                    返回$i;
            }

            返回-1;
        }
    
        //#################################################################################################################### ## #######################
        
        公共靜態$lengthTableBits =陣列(
            數組(10,12,14),
            數組(9,11,13),
            數組(8,16,16),
            數組(8,10,12)
        );
        
        //------------------------------------------------ ----------------------
        公共靜態函數 lengthIndicator($mode, $version)
        {
            如果($模式== QR_MODE_STRUCTURE)
                返回0;
                
            如果($版本  QRSPEC_VERSION_MAX)
                返回0;

            返回自我::$versionPattern[$version -7];
        }// 格式資訊-------------------------------------------- ----
        //參考tests/test_qrspec.c中的calcFormatInfo(原始qrencode c lib)
        
        公共靜態 $formatInfo = 數組(
            數組(0x77c4,0x72f3,0x7daa,0x789d,0x662f,0x6318,0x6c41,0x6976),
            數組(0x5412、0x5125、0x5e7c、0x5b4b、0x45f9、0x40ce、0x4f97、0x4aa0)、
            數組(0x355f,0x3068,0x3f31,0x3a06,0x24b4,0x2183,0x2eda,0x2bed),
            數組(0x1689、0x13be、0x1ce7、0x19d0、0x0762、0x0255、0x0d0c、0x083b)
        );

        公共靜態函數 getFormatInfo($mask, $level)
        {
            if($mask  7)
                返回0;
                
            if($level  3)
                返回0;

            返回自我::$formatInfo[$level][$mask];
        }

        // 框架 - - - - - - - - - - - - - - - - - - - - - - - - ----------------
        // 初始幀的快取。
         
        公共靜態$frames = array();

        /**-------------------------------------------------- ------------------
         * 放置觀景窗圖案。
         * @參數框架
         * @參數寬度
         * @param ox,oy 圖案的左上角座標*/
        公共靜態函數 putFinderPattern(&$frame, $ox, $oy)
        {
            $查找器=陣列(
                “xc1xc1xc1xc1xc1xc1xc1”,
                “xc1xc0xc0xc0xc0xc0xc1”,
                “xc1xc0xc1xc1xc1xc0xc1”,
                “xc1xc0xc1xc1xc1xc0xc1”,
                “xc1xc0xc1xc1xc1xc0xc1”,
                “xc1xc0xc0xc0xc0xc0xc1”,
                “xc1xc1xc1xc1xc1xc1xc1”
            );
            
            for($y=0; $y= 7) {
                $vinf = self::getVersionPattern($version);

                $v = $vinf;
                
                for($x=0; $x> 1;
                    }
                }

                $v = $vinf;
                for($y=0; $y> 1;
                    }
                }
            }
    
            // 還有一點點...
            $frame[$width - 8][8] = "x81";
            
            返回$幀;
        }//------------------------------------------------ ----------------------
        公共靜態函數調試($frame,$binary_mode = false)
        {
            如果($binary_mode){
            
                    foreach ($frame as &$frameLine) {
                        $frameLine = join('<span class="m">  </span>',explode('0', $frameLine));
                        $frameLine = join('██',explode('1', $frameLine));
                    }
                    
                    ? >
                
                    .m { 背景顏色:白色; }
                風格>
                <?php echo '<pre class="brush:php;toolbar:false"><tt><br><br><br>        ';
                    echo join("<br>        ", $frame);
                    echo '</tt><br><br><br><br><br><br>';
            
            } 別的 {
            
                foreach ($frame as &$frameLine) {
                    $frameLine = join('<span class="m"> </span>',explode("xc0", $frameLine));
                    $frameLine = join('<span class="m">?</span>',explode("xc1", $frameLine));
                    $frameLine = join('<span class="p"> </span>',explode("xa0", $frameLine));
                    $frameLine = join('<span class="p">?</span>',explode("xa1", $frameLine));
                    $frameLine = join('<span class="s">◇</span>',explode("x84", $frameLine)); //格式0
                    $frameLine = join('<span class="s">◆</span>',explode("x85", $frameLine)); //格式1
                    $frameLine = join('<span class="x">?</span>',explode("x81", $frameLine)); //特殊位
                    $frameLine = join('<span class="c"> </span>',explode("x90", $frameLine)); //時鐘0
                    $frameLine = join('<span class="c">?</span>',explode("x91", $frameLine)); //時鐘1
                    $frameLine = join('<span class="f"> </span>',explode("x88", $frameLine)); //版本
                    $frameLine = join('<span class="f">?</span>',explode("x89", $frameLine)); //版本
                    $frameLine = join('?',explode("x01", $frameLine));
                    $frameLine = join('?',explode(" ", $frameLine));
                }
                
                ? >
                
                    .p { 背景顏色:黃色; }
                    .m { 背景顏色:#00FF00; }
                    .s { 背景顏色:#FF0000; }
                    .c { 背景顏色:淺綠色; }
                    .x { 背景顏色:粉紅色; }
                    .f { 背景顏色:金色; }
                風格>
                <?php echo "<pre class="brush:php;toolbar:false"><tt>";
                echo join("<br>", $frame);
                迴聲“</tt>”;
            
            }
        }

        //------------------------------------------------ ----------------------
        公共靜態函數序列($frame)
        {
            返回 gzcompress(join("n", $frame), 9);
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數反序列化($code)
        {
            返回爆炸(“n”,gzuncompress($代碼));
        }//------------------------------------------------ ----------------------
        公共靜態函數 newFrame($version)
        {
            if($version  QRSPEC_VERSION_MAX) 
                返回空值;

            if(!isset(self::$frames[$version])) {
                
                $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat';
                
                如果(QR_CACHEABLE){
                    if (file_exists($fileName)) {
                        self::$frames[$version] = self::unserial(file_get_contents($fileName));
                    }另外{
                        self::$frames[$version] = self::createFrame($version);
                        file_put_contents($fileName, self::serial(self::$frames[$version]));
                    }
                }另外{
                    self::$frames[$version] = self::createFrame($version);
                }
            }
            
            if(is_null(self::$frames[$version]))
                返回空值;

            返回 self::$frames[$version];
        }

        //------------------------------------------------ ----------------------
        公共靜態函數 rsBlockNum($spec) { return $spec[0] + $spec[3]; }
        公共靜態函數 rsBlockNum1($spec) { return $spec[0]; }
        公共靜態函數 rsDataCodes1($spec) { return $spec[1]; }
        公共靜態函數 rsEccCodes1($spec) { return $spec[2]; }
        公共靜態函數 rsBlockNum2($spec) { return $spec[3]; }
        公共靜態函數 rsDataCodes2($spec) { return $spec[4]; }
        公共靜態函數 rsEccCodes2($spec) { return $spec[2]; }
        公用靜態函數 rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]);    }
        公用靜態函數 rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; }
        
    }



//---- qrimage.php -----------------------------




/*
 * PHP 二維碼編碼器
 *
 * 使用GD2的程式碼影像輸出
 *
 * PHP QR 碼依照 LGPL 3 分發
 * 版權所有 (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 該庫是免費軟體;您可以重新分配它和/或
 * 根據 GNU Lesser General Public 條款進行修改
 * 自由軟體基金會發布的許可證;任何一個
 * 許可證版本 3 或任何更高版本。
 *
 *這個函式庫的發布是為了希望它有用,
 *但不提供任何保證;甚至沒有默示保證
 * 適用銷性或特定用途的適用性。
 * 較舊的通用公共授權以了解更多詳細資訊。
 *
 * 您應該已收到 GNU Lesser General Public 的副本
 * 與該庫共同獲得許可;如果沒有,請寫信給自由軟體
 * Foundation, Inc.,51 Franklin St, Fifth Floor, Boston, MA 02110-1301 美國
 */
 
    定義('QR_IMAGE',true);

    QRimage 類別 {
    
        //------------------------------------------------ ----------------------
        公共靜態函數 png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) 
        {
            $image = self::image($frame, $pixelPerPoint, $outerFrame);
            
            if ($filename === false) {
                header("內容類型:image/png");
                ImagePng($影像);
            }另外{
                如果($saveandprint===TRUE){
                    ImagePng($映像, $檔名);
                    header("內容類型:圖片/png");
                    ImagePng($影像);
                }另外{
                    ImagePng($映像, $檔名);
                }
            }
            
            影像回顧($圖像);
        }
    
        //------------------------------------------------ ----------------------
        公用靜態函數 jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) 
        {
            $image = self::image($frame, $pixelPerPoint, $outerFrame);
            
            if ($filename === false) {
                標題(“內容類型:圖片/jpeg”);
                ImageJpeg($image, null, $q);
            }另外{
                ImageJpeg($映像, $檔名, $q);            
            }
            
            影像回顧($圖像);
        }//------------------------------------------------ ----------------------
        私有靜態函數圖片($frame, $pixelPerPoint = 4, $outerFrame = 4)
        {
            $h = 計數($frame);
            $w = strlen($frame[0]);
            
            $imgW = $w + 2*$outerFrame;
            $imgH = $h + 2*$outerFrame;
            
            $base_image =ImageCreate($imgW, $imgH);
            
            $col[0] = ImageColorAllocate($base_image,255,255,255);
            $col[1] = ImageColorAllocate($base_image,0,0,0);

            影像填充($base_image, 0, 0, $col[0]);

            for($y=0; $y
 *
 * PHP QR 碼依照 LGPL 3 分發
 * 版權所有 (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 該庫是免費軟體;您可以重新分發它和/或
 * 根據 GNU Lesser General Public 條款進行修改
 * 自由軟體基金會發布的許可證;任何一個
 * 許可證版本 3 或任何更高版本。
 *
 * 這個函式庫的發布是為了希望它有用,
 * 但不提供任何保證;甚至沒有默示保證
 * 適銷性或特定用途的適用性。參見 GNU
 * 較寬鬆的通用公共授權以了解更多詳細資訊。
 *
 * 您應該已收到 GNU Lesser General Public 的副本
 * 與該庫一起獲得許可;如果沒有,請寫信給自由軟體
 * Foundation, Inc.,51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */
 
    定義('STRUCTURE_HEADER_BITS', 20);
    定義('MAX_STRUCTURED_SYMBOLS', 16);

    類別 QRinputItem {
    
        公共$模式;
        公共$大小;
        公共$數據;
        公共$bstream;

        公用函數 __construct($mode, $size, $data, $bstream = null)
        {
            $setData = array_slice($data, 0, $size);
            
            if (count($setData) 模式=$模式;
            $this->size = $size;
            $this->data = $setData;
            $this->bstream = $bstream;
        }
        
        //------------------------------------------------ ----------------------
        公用函數encodeModeNum($version)
        {
            嘗試 {
            
                $words = (int)($this->size / 3);
                $bs = 新的 QRbitstream();
                
                $val = 0x1;
                $bs->appendNum(4, $val);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size);

                for($i=0; $idata[$i*3 ]) - ord('0')) * 100;
                    $val += (ord($this->data[$i*3+1]) - ord('0')) * 10;
                    $val += (ord($this->data[$i*3+2]) - ord('0'));
                    $bs->appendNum(10, $val);
                }

                if($this->size - $words * 3 == 1) {
                    $val = ord($this->data[$words*3]) - ord('0');
                    $bs->appendNum(4, $val);
                } else if($this->size - $words * 3 == 2) {
                    $val = (ord($this->data[$words*3 ]) - ord('0')) * 10;
                    $val += (ord($this->data[$words*3+1]) - ord('0'));
                    $bs->appendNum(7, $val);
                }

                $this->bstream = $bs;
                返回0;
                
            } catch (異常$e) {
                返回-1;
            }
        }//------------------------------------------------ ----------------------
        公用函數encodeModeAn($version)
        {
            嘗試{
                $words = (int)($this->size / 2);
                $bs = 新的 QRbitstream();
                
                $bs->appendNum(4, 0x02);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size);

                for($i=0; $idata[$i*2 ])) * 45;
                    $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1]));

                    $bs->appendNum(11, $val);
                }

                if($this->大小 & 1) {
                    $val = QRinput::lookAnTable(ord($this->data[$words * 2]));
                    $bs->appendNum(6, $val);
                }
        
                $this->bstream = $bs;
                返回0;
            
            } catch (異常$e) {
                返回-1;
            }
        }
        
        //------------------------------------------------ ----------------------
        公用函數encodeMode8($version)
        {
            嘗試{
                $bs = 新的 QRbitstream();

                $bs->appendNum(4, 0x4);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size);

                for($i=0; $isize; $i++) {
                    $bs->appendNum(8, ord($this->data[$i]));
                }

                $this->bstream = $bs;
                返回0;
            
            } catch (異常$e) {
                返回-1;
            }
        }
        
        //------------------------------------------------ ----------------------
        公用函數encodeModeKanji($version)
        {
            嘗試{

                $bs = 新的 QRbitrtream();
                
                $bs->appendNum(4, 0x8);
                $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2));

                for($i=0; $isize; $i+=2) {
                    $val = (ord($this->data[$i]) 數據[$i+1]);
                    if($val > 8) * 0xc0;
                    $val = ($val & 0xff) + $h;

                    $bs->appendNum(13, $val);
                }

                $this->bstream = $bs;
                返回0;
            
            } catch (異常$e) {
                返回-1;
            }
        }

        //------------------------------------------------ ----------------------
        公共函數encodeModeStructure()
        {
            嘗試{
                $bs = 新的 QRbitstream();
                
                $bs->appendNum(4, 0x03);
                $bs->appendNum(4, ord($this->data[1]) - 1);
                $bs->appendNum(4, ord($this->data[0]) - 1);
                $bs->appendNum(8, ord($this->data[2]));

                $this->bstream = $bs;
                返回0;
            
            } catch (異常$e) {
                返回-1;
            }
        }
        
        //------------------------------------------------ ----------------------
        公用函數estimateBitStreamSizeOfEntry($version)
        {
            $位= 0;

            如果($版本== 0) 
                $版本=1;

            開關($這個->模式){
                case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size);    休息;
                案例 QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size);    休息;
                案例 QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size);    休息;
                case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break;
                案例 QR_MODE_STRUCTURE:返回 STRUCTURE_HEADER_BITS;            
                預設:
                    返回0;
            }

            $l = QRspec::lengthIndicator($this->mode, $version);
            $m = 1 size + $m - 1) / $m);

            $bits += $num * (4 + $l);

            返回$位;
        }//------------------------------------------------ ----------------------
        公用函數encodeBitStream($version)
        {
            嘗試 {
            
                取消設定($this->bstream);
                $words = QRspec::maximumWords($this->mode, $version);
                
                if($this->大小>$words) {
                
                    $st1 = new QRinputItem($this->mode, $words, $this->data);
                    $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words));

                    $st1->encodeBitStream($version);
                    $st2->encodeBitStream($version);
                    
                    $this->bstream = new QRbitstream();
                    $this->bstream->append($st1->bstream);
                    $this->bstream->append($st2->bstream);
                    
                    取消設定($st1);
                    取消設定($st2);
                    
                } 別的 {
                    
                    $ret = 0;
                    
                    開關($這個->模式){
                        case QR_MODE_NUM: $ret = $this->encodeModeNum($version); 休息;
                        case QR_MODE_AN: $ret = $this->encodeModeAn($version); 休息;
                        case QR_MODE_8: $ret = $this->encodeMode8($version); 休息;
                        case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break;
                        case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); 休息;
                        
                        預設:
                            休息;
                    }
                    
                    if($ret bstream->size();
            
            } catch (異常$e) {
                返回-1;
            }
        }
    };
    
    //#################################################################################################################### ## ###########################

    類別 QRinput {

        公共$項目;
        
        私人$版本;
        私人$級別;
        
        //------------------------------------------------ ----------------------
        公用函數 __construct($version = 0, $level = QR_ECLEVEL_L)
        {
            if ($version  QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) {
                throw new Exception('版本號碼無效');
                返回空值;
            }
            
            $這個->版本= $版本;
            $this->level = $level;
        }
        
        //------------------------------------------------ ----------------------
        公用函數 getVersion()
        {
            返回 $this->version;
        }
        
        //------------------------------------------------ ----------------------
        公用函數 setVersion($version)
        {
            if($version  QRSPEC_VERSION_MAX) {
                throw new Exception('版本號碼無效');
                返回-1;
            }

            $這個->版本= $版本;

            返回0;
        }
        
        //------------------------------------------------ ----------------------
        公用函數 getErrorCorrectionLevel()
        {
            返回 $this->level;
        }

        //------------------------------------------------ ----------------------
        公用函數 setErrorCorrectionLevel($level)
        {
            if($level > QR_ECLEVEL_H) {
                拋出新的異常('無效的ECLEVEL');
                返回-1;
            }

            $this->level = $level;

            返回0;
        }
        
        //------------------------------------------------ ----------------------
        公用函數appendEntry(QRinputItem $entry)
        {
            $this->items[] = $entry;
        }
        
        //------------------------------------------------ ----------------------
        公用函數附加($模式,$大小,$資料)
        {
            嘗試 {
                $entry = new QRinputItem($mode, $size, $data);
                $this->items[] = $entry;
                返回0;
            } catch (異常$e) {
                返回-1;
            }
        }
        
        //------------------------------------------------ ----------------------
        
        公用函數 insertStructuredAppendHeader($size, $index, $parity)
        {
            if( $size > MAX_STRUCTURED_SYMBOLS ) {
                throw new Exception('insertStructuredAppendHeader 大小錯誤');
            }if( $index  MAX_STRUCTURED_SYMBOLS ) {
                throw new Exception('insertStructuredAppendHeader 索引錯誤');
            }

            $buf = 陣列($size, $index, $parity);
            
            嘗試 {
                $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf);
                array_unshift($this->items, $entry);
                返回0;
            } catch (異常$e) {
                返回-1;
            }
        }

        //------------------------------------------------ ----------------------
        公共函數 calcParity()
        {
            $奇偶校驗= 0;
            
            foreach($this->items as $item) {
                if($item->mode != QR_MODE_STRUCTURE) {
                    for($i=$item->size-1; $i>=0; $i--) {
                        $parity ^= $item->data[$i];
                    }
                }
            }

            回傳$奇偶校驗;
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數 checkModeNum($size, $data)
        {
            for($i=0; $i ord('9'))){
                    返回假;
                }
            }

            返回真;
        }

        //------------------------------------------------ ----------------------
        公共靜態函數estimateBitsModeNum($size)
        {
            $w = (int)$大小 / 3;
            $bits = $w * 10;
            
            開關($size - $w * 3) {
                情況1:
                    $位+= 4;
                    休息;
                案例2:
                    $位+= 7;
                    休息;
                預設:
                    休息;
            }

            返回$位;
        }
        
        //------------------------------------------------ ----------------------
        公用靜態$anTable =陣列(
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            36、-1、-1、-1、37、38、-1、-1、-1、-1、39、40、-1、41、42、43、
             0、1、2、3、4、5、6、7、8、9、44、-1、-1、-1、-1、-1、
            -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
            25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
            -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
        );
        
        //------------------------------------------------ ----------------------
        公用靜態函數lookAnTable($c)
        {
            return (($c > 127)?-1:self::$anTable[$c]);
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數 checkModeAn($size, $data)
        {
            for($i=0; $i 0x9ffc && $val  0xebbf){
                    返回假;
                }
            }

            返回真;
        }/**************************************************** **** ******************
         * 驗證
         ************************************************** **** *******************/

        公共靜態函數檢查($mode,$size,$data)
        {
            if($大小 items as $item) {
                $bits += $item->estimateBitStreamSizeOfEntry($version);
            }

            返回$位;
        }
        
        //------------------------------------------------ ----------------------
        公用函數estimateVersion()
        {
            $版本=0;
            $上一個 = 0;
            做 {
                $上一個= $版本;
                $bits = $this->estimateBitStreamSize($prev);
                $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level);
                如果($版本 $prev);

            返回$版本;
        }
        
        //------------------------------------------------ ----------------------
        公共靜態函數 lengthOfCode($mode, $version, $bits)
        {
            $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version);
            開關($模式){
                案例 QR_MODE_NUM:
                    $塊=(int)($有效負載/ 10);
                    $remain = $payload - $chunks * 10;
                    $大小 = $塊 * 3;
                    if($remain >= 7) {
                        $大小+= 2;
                    } else if($remain >= 4) {
                        $大小+= 1;
                    }
                    休息;
                案例 QR_MODE_AN:
                    $塊=(int)($有效負載/ 11);
                    $remain = $payload - $chunks * 11;
                    $大小 = $塊 * 2;
                    if($剩餘>= 6)
                        $大小++;
                    休息;
                案例 QR_MODE_8:
                    $大小 = (int)($有效負載 / 8);
                    休息;
                案例 QR_MODE_KANJI:
                    $大小 = (int)(($有效負載 / 13) * 2);
                    休息;
                案例 QR_MODE_STRUCTURE:
                    $大小 = (int)($有效負載 / 8);
                    休息;
                預設:
                    $大小= 0;
                    休息;
            }
            
            $maxsize = QRspec::maximumWords($mode, $version);
            if($size  $maxsize) $size = $maxsize;

            返回$大小;
        }
        
        //------------------------------------------------ ----------------------
        公用函數createBitStream()
        {
            $至</deltalab></deltalab></deltalab></fukuchi>
</tfoot></deltalab></deltalab></fukuchi>
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn