ホームページ  >  記事  >  バックエンド開発  >  php QRコード生成

php QRコード生成

WBOY
WBOYオリジナル
2016-08-08 09:32:411520ブラウズ

QR コードを生成するにはいくつかの方法がありますが、最も早い方法は Google の API を使用することです。 Google がブロックされていて、うまく機能しないことが多いのは残念です。次に、より便利な方法について話しましょう。

詳細なドキュメントとコードについては、http://phpqrcode.sourceforge.net/ にアクセスしてください。

以下は記載情報を元にQRコードを自動生成する簡易版です。そして指定したディレクトリに保存します。

メインプログラムコード

		<?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 という名前を付けます。上記のコードを実行して QR コードを生成します。 。 。 。

生成された 2 つの QR コードを投稿します


php クラス ファイル (http://phpqrcode.sourceforge.net/ より)

<?php

/*
 * PHP QRコードエンコーダー
 *
 * このファイルには、PHP QR コード ライブラリの MERGED バージョンが含まれています。
 *便宜上、完全版から自動生成されました。
 *
 * このマージされたバージョンは外部ファイルを必要としないように構成されています。
 * キャッシュを無効にし、エラーログを作成し、マスクマッチングは遅くなりますが、より高速になります。
 ※チューンナップが必要な場合は、マージされていないバージョンをご利用ください。
 *
 * 完全版、ドキュメント、使用例については、以下をご覧ください。
 *
 * http://phpqrcode.sourceforge.net/
 * https://sourceforge.net/projects/phpqrcode/
 *
 * PHP QR コードは LGPL 3 に基づいて配布されています
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * このライブラリはフリーソフトウェアです。再配布したり、
 * GNU Lesser General Public の規約に基づいて変更してください
 * Free Software Foundation によって発行されたライセンス。どちらか
 * ライセンスのバージョン 3 以降のバージョン。
 *
 ※このライブラリは、皆様のお役に立つことを願って配布しておりますが、
 * ただし、いかなる保証もありません。黙示の保証さえなしに、
 * 商品性または特定の目的への適合性。 GNU を参照
 * 詳細については、劣等一般公衆利用許諾書を参照してください。
 *
 * GNU Lesser General Public のコピーを受け取っているはずです
 * このライブラリと一緒にライセンスを取得します。そうでない場合は、フリーソフトウェアに書き込みます
 * Foundation, Inc.、51 Franklin St、5 階、ボストン、マサチューセッツ州 02110-1301 米国
 */
 
 

/*
 * バージョン: 1.1.4
 * ビルド: 2010100721
 */



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





/*
 * PHP QRコードエンコーダ
 *
 ※共通定数
 *
 * LGPL 2.1 で配布される libqrencode C ライブラリに基づく
 ※Copyright (C) 2006, 2007, 2008, 2009 福地 健太郎 <fukuchi>
 *
 * PHP QR コードは LGPL 3 に基づいて配布されています
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * このライブラリはフリーソフトウェアです。再配布したり、
 * GNU Lesser General Public の規約に基づいて変更してください
 * Free Software Foundation によって発行されたライセンス。どちらか
 * ライセンスのバージョン 3 以降のバージョン。
 *
 ※このライブラリは、皆様のお役に立つことを願って配布しておりますが、
 * ただし、いかなる保証もありません。黙示の保証さえなしに、
 * 商品性または特定の目的への適合性。 GNU を参照
 * 詳細については、劣等一般公衆利用許諾書を参照してください。
 *
 * GNU Lesser General Public のコピーを受け取っているはずです
 * このライブラリと一緒にライセンスを取得します。そうでない場合は、フリーソフトウェアに書き込みます
 * Foundation, Inc.、51 Franklin St、5 階、ボストン、マサチューセッツ州 02110-1301 米国
 */
 
	// エンコードモード
	 
	定義('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 {
		パブリック静的関数 set(&$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コードエンコーダ
 *
 * 構成ファイル、マージされたバージョン用に調整
 */
     
    定義('QR_CACHEABLE', false);       // キャッシュを使用します - ディスク読み取りは増加しますが、CPU パワーは低下し、マスクとフォーマット テンプレートがキャッシュに保存されます
    定義('QR_CACHE_DIR', false);       // QR_CACHEABLE === true の場合に使用されます
    定義('QR_LOG_DIR', false);         // デフォルトのエラーログディレクトリ   
    
    定義('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 QRコードエンコーダ
 *
 * ツールセット、便利なユーティリティ、およびデバッグ ユーティリティ。
 *
 * PHP QR コードは LGPL 3 に基づいて配布されています
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * このライブラリはフリーソフトウェアです。再配布したり、
 * GNU Lesser General Public の規約に基づいて変更してください
 * Free Software Foundation によって発行されたライセンス。どちらか
 * ライセンスのバージョン 3 以降のバージョン。
 *
 ※このライブラリは、皆様のお役に立つことを願って配布しておりますが、
 * ただし、いかなる保証もありません。黙示の保証さえなしに、
 * 商品性または特定の目的への適合性。 GNU を参照
 * 詳細については、劣等一般公衆利用許諾書を参照してください。
 *
 * GNU Lesser General Public のコピーを受け取っているはずです
 * このライブラリと一緒にライセンスを取得します。そうでない場合は、フリーソフトウェアに書き込みます
 * Foundation, Inc.、51 Franklin St、5 階、ボストン、マサチューセッツ州 02110-1301 米国
 */

    クラス QRtools {
    
        //------------------------------------------------ ------------------------
        パブリック静的関数 binarize($frame)
        {
            $len = カウント($frame);
            foreach ($frame as &$frameLine) {
                
                for($i=0; $i 1) {
                $eccLevel = $mode[1];
            }
                
            $qrTab = QRcode::text($code, false, $eccLevel);
            $size = カウント($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)
        {
            if (QR_LOG_DIR !== false) {
                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) 
        {
            $width = カウント($frame);
            for($y=0;$y 0) {
                    echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6)。 's</td></tr>';
                } それ以外 {
                    $startTime = $thisTime;
                }
                
                $p++;
                $lastTime = $thisTime;
            }
            
            echo '</tbody><tfoot>
                <tr style="border-top:2px ソリッド ブラック"><th style="text-align:right">合計: </th><td>'.number_format($lastTime-$startTime 、6).の</td></tr>;
            </tfoot>
            </テーブル>';
        }
        
    }//################################################ ########################
    
    QRtools::markTime('start');
    



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




/*
 * PHP QRコードエンコーダ
 *
 ※QRコード仕様
 *
 * LGPL 2.1 で配布される libqrencode C ライブラリに基づく
 ※Copyright (C) 2006, 2007, 2008, 2009 福地 健太郎 <fukuchi>
 *
 * PHP QR コードは LGPL 3 に基づいて配布されています
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 以下のデータ/仕様は、
 ※「二次元シンボル QRコード 基本仕様書」(JIS X0510:2004)
 *  または
 * 「自動識別およびデータ収集技術 -- 
 * QR Code 2005 バーコード シンボル仕様」 (ISO/IEC 18004:2006)
 *
 * このライブラリはフリーソフトウェアです。再配布したり、
 * GNU Lesser General Public の規約に基づいて変更してください
 * Free Software Foundation によって発行されたライセンス。どちらか
 * ライセンスのバージョン 3 以降のバージョン。
 *
 ※このライブラリは、皆様のお役に立つことを願って配布しておりますが、
 * ただし、いかなる保証もありません。黙示の保証さえなしに、
 * 商品性または特定の目的への適合性。 GNU を参照
 * 詳細については、劣等一般公衆利用許諾書を参照してください。
 *
 * GNU Lesser General Public のコピーを受け取っているはずです
 * このライブラリと一緒にライセンスを取得します。そうでない場合は、フリーソフトウェアに書き込みます
 * Foundation, Inc.、51 Franklin St、5 階、ボストン、マサチューセッツ州 02110-1301 米国
 */
 
    定義('QRSPEC_VERSION_MAX', 40);
    定義('QRSPEC_WIDTH_MAX', 177);

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

    クラス QRspec {
    
        パブリック静的 $capacity = array(
            配列( 0, 0, 0, 配列( 0, 0, 0, 0)),
            array( 21, 26, 0, array( 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))、
            array( 37, 134, 7, array( 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)),
            array( 57, 346, 0, array( 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)),
            array( 77, 655, 3, array( 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)),
            array( 97, 1085, 3, array( 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)),
            array(117, 1588, 4, array( 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)),
            array(137, 2185, 3, array( 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)),
            array(157, 2876, 0, array( 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)),
            array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40
        );
        
        //------------------------------------------------ ------------------------
        パブリック静的関数 getDataLength($version, $level)
        {
            return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];
        }//------------------------------------------------ ------------------------
        パブリック静的関数 getECCLength($version, $level)
        {
            return self::$capacity[$version][QRCAP_EC][$level];
        }
        
        //------------------------------------------------ ------------------------
        パブリック静的関数 getWidth($version)
        {
            self::$capacity[$version][QRCAP_WIDTH] を返します。
        }
        
        //------------------------------------------------ ------------------------
        パブリック静的関数 getRemainder($version)
        {
            return self::$capacity[$version][QRCAP_REMINDER];
        }
        
        //------------------------------------------------ ------------------------
        パブリック静的関数 getMinimumVersion($size, $level)
        {

            for($i=1; $i= $size) 
                    $i を返します。
            }

            -1 を返します。
        }
    
        //################################################ ######################
        
        public static $lengthTableBits = array(
            配列(10, 12, 14)、
            配列(9、11、13)、
            配列(8, 16, 16)、
            配列(8、10、12)
        );
        
        //------------------------------------------------ ------------------------
        パブリック静的関数 lengthIndicator($mode, $version)
        {
            if ($mode == QR_MODE_STRUCTURE)
                0を返します。
                
            if ($version >> 1;
                    }
                }
            }
    
            // そして少し...  
            $frame[$width - 8][8] = "x81";
            
            $frame を返します。
        }//------------------------------------------------ ------------------------
        パブリック静的関数デバッグ($frame, $binary_mode = false)
        {
            if ($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>






'; } それ以外 { foreach ($frame as &$frameLine) { $frameLine = join('',explode("xc0", $frameLine)); $frameLine = join('?',explode("xc1", $frameLine)); $frameLine = join(' ',explode("xa0", $frameLine)); $frameLine = join('?',explode("xa1", $frameLine)); $frameLine = join('',explode("x84", $frameLine)); //フォーマット0 $frameLine = join('',explode("x85", $frameLine)); //フォーマット1 $frameLine = join('?',explode("x81", $frameLine)); //特殊ビット $frameLine = join('',explode("x90", $frameLine)); //クロック0 $frameLine = join('?',explode("x91", $frameLine)); //クロック1 $frameLine = join('',explode("x88", $frameLine)); //バージョン $frameLine = join('?',explode("x89", $frameLine)); //バージョン $frameLine = join('?',explode("x01", $frameLine)); $frameLine = join('?',explode(" ", $frameLine)); } ?> .p { 背景色: 黄色; } .m { 背景色: #00FF00; } .s { 背景色: #FF0000; } .c { 背景色: アクア; } .x { 背景色: ピンク; } .f { 背景色: ゴールド; } <tt>"; echo join("<br/ >", $frame); echo "</tt>"; } } //------------------------------------------------ ------------------------ パブリック静的関数シリアル($frame) { return gzcompress(join("n", $frame), 9); } //------------------------------------------------ ------------------------ パブリック静的関数 unserial($code) { returnexplode("n", gzuncompress($code)); }//------------------------------------------------ ------------------------ パブリック静的関数 newFrame($version) { if($version QRSPEC_VERSION_MAX) null を返します。 if(!isset(self::$frames[$version])) { $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; if (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])) null を返します。 self::$frames[$version] を返します。 } //------------------------------------------------ ------------------------ public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } パブリック静的関数 rsBlockNum1($spec) { return $spec[0]; } public static function rsDataCodes1($spec) { return $spec[1]; } パブリック静的関数 rsEccCodes1($spec) { return $spec[2]; } パブリック静的関数 rsBlockNum2($spec) { return $spec[3]; } public static function rsDataCodes2($spec) { return $spec[4]; } public static function rsEccCodes2($spec) { return $spec[2]; } public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } } //---- qrimage.php ----------------------------- /* * PHP QRコードエンコーダ * ※GD2を使用したコードの画像出力 * * PHP QR コードは LGPL 3 に基づいて配布されています * Copyright (C) 2010 Dominik Dzienia * * このライブラリはフリーソフトウェアです。再配布したり、 * GNU Lesser General Public の規約に基づいて変更してください * Free Software Foundation によって発行されたライセンス。どちらか * ライセンスのバージョン 3 以降のバージョン。 * ※このライブラリは、皆様のお役に立つことを願って配布しておりますが、 * ただし、いかなる保証もありません。黙示の保証さえなしに、 * 商品性または特定の目的への適合性。 GNU を参照 * 詳細については、劣等一般公衆利用許諾書を参照してください。 * * GNU Lesser General Public のコピーを受け取っているはずです * このライブラリと一緒にライセンスを取得します。そうでない場合は、フリーソフトウェアに書き込みます * Foundation, Inc.、51 Franklin St、5 階、ボストン、マサチューセッツ州 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($image); } それ以外 { if($saveandprint===TRUE){ ImagePng($image, $filename); header("コンテンツタイプ: image/png"); ImagePng($image); }それ以外{ ImagePng($image, $filename); } } ImageDestroy($image); } //------------------------------------------------ ------------------------ パブリック静的関数 jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("コンテンツタイプ: image/jpeg"); ImageJpeg($image, null, $q); } それ以外 { ImageJpeg($image, $filename, $q); } ImageDestroy($image); }//------------------------------------------------ ------------------------ プライベート静的関数 image($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); imagefill($base_image, 0, 0, $col[0]); for($y=0; $y * * PHP QR コードは LGPL 3 に基づいて配布されています * Copyright (C) 2010 Dominik Dzienia * * このライブラリはフリーソフトウェアです。再配布したり、 * GNU Lesser General Public の規約に基づいて変更してください * Free Software Foundation によって発行されたライセンス。どちらか * ライセンスのバージョン 3 以降のバージョン。 * ※このライブラリは、皆様のお役に立つことを願って配布しておりますが、 * ただし、いかなる保証もありません。黙示の保証さえなしに、 * 商品性または特定の目的への適合性。 GNU を参照 * 詳細については、劣等一般公衆利用許諾書を参照してください。 * * GNU Lesser General Public のコピーを受け取っているはずです * このライブラリと一緒にライセンスを取得します。そうでない場合は、フリーソフトウェアに書き込みます * Foundation, Inc.、51 Franklin St、5 階、ボストン、マサチューセッツ州 02110-1301 米国 */ 定義('STRUCTURE_HEADER_BITS', 20); 定義('MAX_STRUCTURED_SYMBOLS', 16); クラス QRinputItem { パブリック$モード; パブリック $size; パブリック $data; パブリック $bstream; パブリック関数 __construct($mode, $size, $data, $bstream = null) { $setData = array_slice($data, 0, $size); if (count($setData) mode = $mode; $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->size & 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]) << 8) | ord($this->data[$i+1]); if($val <= 0x9ffc) { $val -= 0x8140; } それ以外 { $val -= 0xc140; } $h = ($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; if($version == 0) $バージョン = 1; switch($this->mode) { 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); $bits を返します。 }//------------------------------------------------ ------------------------ パブリック関数 encodeBitStream($version) { 試す { unset($this->bstream); $words = QRspec::maximumWords($this->mode, $version); if($this->size > $words) { $st1 = 新しい QRinputItem($this->mode, $words, $this->data); $st2 = 新しい QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); $st1->encodeBitStream($version); $st2->encodeBitStream($version); $this->bstream = 新しい QRbitstream(); $this->bstream->append($st1->bstream); $this->bstream->append($st2->bstream); 設定を解除($st1); 設定を解除($st2); } それ以外 { $ret = 0; switch($this->mode) { QR_MODE_NUM の場合: $ret = $this->encodeModeNum($version); 壊す; QR_MODE_AN の場合: $ret = $this->encodeModeAn($version); 壊す; QR_MODE_8 の場合: $ret = $this->encodeMode8($version); 壊す; case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; QR_MODE_STRUCTURE の場合: $ret = $this->encodeModeStructure(); 壊す; デフォルト: 壊す; } if($ret bstream->size(); を返す } catch (例外 $e) { -1 を返します。 } } }; //################################################ ######################## クラス QRinput { パブリック $items; プライベート $バージョン; プライベート $レベル; //------------------------------------------------ ------------------------ パブリック関数 __construct($version = 0, $level = QR_ECLEVEL_L) { if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { throw new Exception('無効なバージョン番号'); NULL を返します。 } $this->version = $version; $this->level = $level; } //------------------------------------------------ ------------------------ パブリック関数 getVersion() { $this->バージョンを返します; } //------------------------------------------------ ------------------------ パブリック関数 setVersion($version) { if($version QRSPEC_VERSION_MAX) { throw new Exception('無効なバージョン番号'); -1 を返します。 } $this->version = $version; 0を返します。 } //------------------------------------------------ ------------------------ パブリック関数 getErrorCorrectionLevel() { $this->レベルを返します; } //------------------------------------------------ ------------------------ パブリック関数 setErrorCorrectionLevel($level) { if($level > QR_ECLEVEL_H) { throw new Exception('無効な ECLEVEL'); -1 を返します。 } $this->level = $level; 0を返します。 } //------------------------------------------------ ------------------------ パブリック関数 appendEntry(QRinputItem $entry) { $this->items[] = $entry; } //------------------------------------------------ ------------------------ パブリック関数 append($mode, $size, $data) { 試す { $entry = 新しい QRinputItem($mode, $size, $data); $this->items[] = $entry; 0を返します。 } catch (例外 $e) { -1 を返します。 } } //------------------------------------------------ ------------------------ public function 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 = 新しい 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 127)?-1:self::$anTable[$c]); } //------------------------------------------------ ------------------------ パブリック静的関数 checkModeAn($size, $data) { for($i=0; $i 0x9ffc && $val 0xebbf) { false を返します。 } } true を返します。 }/*************************************************** ******************* * 検証 ************************************************* ********************/ パブリック静的関数チェック($mode, $size, $data) { if($size items as $item) { $bits += $item->estimateBitStreamSizeOfEntry($version); } $bits を返します。 } //------------------------------------------------ ------------------------ パブリック関数estimateVersion() { $バージョン = 0; $prev = 0; する { $prev = $version; $bits = $this->estimateBitStreamSize($prev); $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); if ($version $prev); $version を返します。 } //------------------------------------------------ ------------------------ パブリック静的関数 lengthOfCode($mode, $version, $bits) { $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); スイッチ($mode) { ケース QR_MODE_NUM: $chunks = (int)($payload / 10); $remain = $payload - $chunks * 10; $size = $chunks * 3; if($remain >= 7) { $size += 2; } else if($remain >= 4) { $size += 1; } 壊す; QR_MODE_AN の場合: $chunks = (int)($payload / 11); $remain = $payload - $chunks * 11; $size = $chunks * 2; if($remain >= 6) $サイズ++; 壊す; QR_MODE_8の場合: $size = (int)($payload / 8); 壊す; QR_MODE_KANJIの場合: $size = (int)(($payload / 13) * 2); 壊す; QR_MODE_STRUCTURE の場合: $size = (int)($payload / 8); 壊す; デフォルト: $サイズ = 0; 壊す; } $maxsize = QRspec::maximumWords($mode, $version); if($size $maxsize) $size = $maxsize; $size を返します。 } //------------------------------------------------ ------------------------ パブリック関数 createBitStream() { $to
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。