產生二維碼,有好幾種方法,最快捷的方法就是使用Google的api。可惜Google被牆,很多時候都不好使。現在說一種比較好用的方法。
詳細的文檔和程式碼,請移步http://phpqrcode.sourceforge.net/。
下面是精簡版,根據寫入的訊息,自動產生二維碼。並且儲存到指定的目錄。
主程式碼
<?php include "./phpqrcode/qrcode.php"; //导入主文件 $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'qrcode'.DIRECTORY_SEPARATOR;//文件保存目录 $PNG_WEB_DIR = 'qrcode/';//用于预览 if (!file_exists($PNG_TEMP_DIR)) mkdir($PNG_TEMP_DIR); $data = "test";//二维码写入内容 $errorCorrectionLevel = 'L';//错误处理级别 $matrixPointSize = 6;//二维码尺寸大小 //md5加密生成文件名,data可以使用数据库id或者其他唯一标识符 $filename = $PNG_TEMP_DIR.md5($data.'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png'; //使用QRcode类生成二维码,文件保存在PNG_TEMP_DIR下 QRcode::png($data, $filename, $errorCorrectionLevel, $matrixPointSize, 2); //图片预览 echo '<img src="'.$PNG_WEB_DIR.basename($filename).'" /><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>