Heim  >  Artikel  >  Backend-Entwicklung  >  PHP-QR-Code-Generierung

PHP-QR-Code-Generierung

WBOY
WBOYOriginal
2016-08-08 09:32:411518Durchsuche

Es gibt mehrere Möglichkeiten, einen QR-Code zu generieren. Der schnellste Weg ist die Verwendung der Google-API. Schade, dass Google blockiert ist und es in vielen Fällen nicht so gut funktioniert. Lassen Sie uns nun über eine nützlichere Methode sprechen.

Ausführliche Dokumentation und Code finden Sie unter http://phpqrcode.sourceforge.net/.

Das Folgende ist eine vereinfachte Version, die automatisch einen QR-Code basierend auf den geschriebenen Informationen generiert. und speichern Sie es im angegebenen Verzeichnis.

Hauptprogrammcode

		<?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/>';  
        ?>

Anhänge können nicht hinzugefügt werden, was mich zwingt, den folgenden Code einzufügen. . . Kopieren Sie den folgenden langen Code in eine neue Datei und nennen Sie sie qrcode.php. Führen Sie den obigen Code aus, um einen QR-Code zu generieren. . . .

Zwei generierte QR-Codes veröffentlichen


PHP-Klassendateien (von http://phpqrcode.sourceforge.net /)

<?php

/*
 * PHP-QR-Code-Encoder
 *
 * Diese Datei enthält die MERGED-Version der PHP-QR-Code-Bibliothek.
 * Zur Vereinfachung wurde es automatisch aus der Vollversion generiert.
 *
 * Diese zusammengeführte Version wurde so konfiguriert, dass keine externen Dateien erforderlich sind.
 * mit deaktiviertem Cache, Fehlerprotokollierung und weniger, aber schnellerem Maskenabgleich.
 * Wenn Sie eine Optimierung benötigen, verwenden Sie bitte die nicht zusammengeführte Version.
 *
 * Die Vollversion, Dokumentation und Anwendungsbeispiele finden Sie unter:
 *
 * http://phpqrcode.sourceforge.net/
 * https://sourceforge.net/projects/phpqrcode/
 *
 * PHP-QR-Code wird unter LGPL 3 vertrieben
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * Bei dieser Bibliothek handelt es sich um freie Software; Sie können es weiterverbreiten und/oder
 * Ändern Sie es gemäß den Bedingungen der GNU Lesser General Public
 * Lizenz wie von der Free Software Foundation veröffentlicht; entweder
 * Version 3 der Lizenz oder eine spätere Version.
 *
 * Diese Bibliothek wird in der Hoffnung verteilt, dass sie nützlich sein wird,
 * jedoch OHNE JEGLICHE GARANTIE; ohne die stillschweigende Garantie von
 * MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU
 *Lesser General Public License für weitere Details.
 *
 * Sie sollten ein Exemplar der GNU Lesser General Public erhalten haben
 * Lizenz zusammen mit dieser Bibliothek; Wenn nicht, schreiben Sie an die Freie Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */
 
 

/*
 * Version: 1.1.4
 * Baujahr: 2010100721
 */



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





/*
 * PHP-QR-Code-Encoder
 *
 * Gemeinsame Konstanten
 *
 * Basierend auf der libqrencode C-Bibliothek, die unter LGPL 2.1 vertrieben wird
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP-QR-Code wird unter LGPL 3 vertrieben
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * Bei dieser Bibliothek handelt es sich um freie Software; Sie können es weiterverbreiten und/oder
 * Ändern Sie es gemäß den Bedingungen der GNU Lesser General Public
 * Lizenz wie von der Free Software Foundation veröffentlicht; entweder
 * Version 3 der Lizenz oder eine spätere Version.
 *
 * Diese Bibliothek wird in der Hoffnung verteilt, dass sie nützlich sein wird,
 * jedoch OHNE JEGLICHE GARANTIE; ohne die stillschweigende Garantie von
 * MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU
 *Lesser General Public License für weitere Details.
 *
 * Sie sollten ein Exemplar der GNU Lesser General Public erhalten haben
 * Lizenz zusammen mit dieser Bibliothek; Wenn nicht, schreiben Sie an die Freie Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */
 
	// Kodierungsmodi
	 
	define('QR_MODE_NUL', -1);
	define('QR_MODE_NUM', 0);
	define('QR_MODE_AN', 1);
	define('QR_MODE_8', 2);
	define('QR_MODE_KANJI', 3);
	define('QR_MODE_STRUCTURE', 4);

	// Stufen der Fehlerkorrektur.

	define('QR_ECLEVEL_L', 0);
	define('QR_ECLEVEL_M', 1);
	define('QR_ECLEVEL_Q', 2);
	define('QR_ECLEVEL_H', 3);
	
	// Unterstützte Ausgabeformate
	
	define('QR_FORMAT_TEXT', 0);
	define('QR_FORMAT_PNG', 1);
	
	Klasse qrstr {
		öffentliche statische Funktion 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-Code-Encoder
 *
 * Konfigurationsdatei, optimiert für die zusammengeführte Version
 */
     
    define('QR_CACHEABLE', false);       // Cache verwenden – mehr Festplatten-Lesevorgänge, aber weniger CPU-Leistung, Masken und Formatvorlagen werden dort gespeichert
    define('QR_CACHE_DIR', false);       // wird verwendet, wenn QR_CACHEABLE === true
    define('QR_LOG_DIR', false);         // Standardverzeichnis für Fehlerprotokolle   
    
    define('QR_FIND_BEST_MASK', true);                                                          // wenn true, schätzt die beste Maske (spez. Standard, aber extrem langsam; auf false setzen, um die Leistung erheblich zu steigern, aber (wahrscheinlich) Code mit der schlechtesten Qualität
    define('QR_FIND_FROM_RANDOM', 2);                                                       // wenn false, werden alle verfügbaren Masken überprüft, andernfalls gibt der Wert an, dass die Anzahl der Masken überprüft werden muss, die Masken-ID wird zufällig ermittelt
    define('QR_DEFAULT_MASK', 2);                                                               // wenn QR_FIND_BEST_MASK === false
                                                  
    define('QR_PNG_MAXIMUM_SIZE', 1024);                                                       // maximal zulässige PNG-Bildbreite (in Pixel), optimieren, um sicherzustellen, dass GD und PHP mit so großen Bildern umgehen können
                                                  



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




/*
 * PHP-QR-Code-Encoder
 *
 * Toolset, praktische und Debug-Dienstprogramme.
 *
 * PHP-QR-Code wird unter LGPL 3 vertrieben
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * Bei dieser Bibliothek handelt es sich um freie Software; Sie können es weiterverbreiten und/oder
 * Ändern Sie es gemäß den Bedingungen der GNU Lesser General Public
 * Lizenz wie von der Free Software Foundation veröffentlicht; entweder
 * Version 3 der Lizenz oder eine spätere Version.
 *
 * Diese Bibliothek wird in der Hoffnung verteilt, dass sie nützlich sein wird,
 * jedoch OHNE JEGLICHE GARANTIE; ohne die stillschweigende Garantie von
 * MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU
 *Lesser General Public License für weitere Details.
 *
 * Sie sollten ein Exemplar der GNU Lesser General Public erhalten haben
 * Lizenz zusammen mit dieser Bibliothek; Wenn nicht, schreiben Sie an die Freie Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */

    Klasse QRtools {
    
        //------------------------------------------------ ----------------------
        öffentliche statische Funktion binarize($frame)
        {
            $len = count($frame);
            foreach ($frame as &$frameLine) {
                
                for($i=0; $i<$len; $i ) {
                    $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
                }
            }
            
            return $frame;
        }
        
        //------------------------------------------------ ----------------------
        öffentliche statische Funktion tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')
        {
            $barcode_array = array();
            
            if (!is_array($mode))
                $mode = explosion(',', $mode);
                
            $eccLevel = 'L';
                
            if (count($mode) > 1) {
                $eccLevel = $mode[1];
            }
                
            $qrTab = QRcode::text($code, false, $eccLevel);
            $size = count($qrTab);
                
            $barcode_array['num_rows'] = $size;
            $barcode_array['num_cols'] = $size;
            $barcode_array['bcode'] = array();
                
            foreach ($qrTab as $line) {
                $arrAdd = array();
                foreach(str_split($line) as $char)
                    $arrAdd[] = ($char=='1')?1:0;
                $barcode_array['bcode'][] = $arrAdd;
            }
                    
            return $barcode_array;
        }
        
        //------------------------------------------------ ----------------------
        öffentliche statische Funktion clearCache()
        {
            self::$frames = array();
        }
        
        //------------------------------------------------ ----------------------
        öffentliche statische Funktion buildCache()
        {
			QRtools::markTime('before_build_cache');
			
			$mask = neue QRmask();
            for ($a=1; $a <= QRSPEC_VERSION_MAX; $a ) {
                $frame = QRspec::newFrame($a);
                if (QR_IMAGE) {
                    $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';
                    QRimage::png(self::binarize($frame), $fileName, 1, 0);
                }
				
				$width = count($frame);
				$bitMask = array_fill(0, $width, array_fill(0, $width, 0));
				for ($maskNo=0; $maskNo<8; $maskNo )
					$mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
            }QRtools::markTime('after_build_cache');
        }

        //------------------------------------------------ ----------------------
        öffentliches statisches Funktionsprotokoll ($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);
                    } anders {
                        file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
                    }
                }    
            }
        }
        
        //------------------------------------------------ ----------------------
        öffentliche statische Funktion dumpMask($frame) 
        {
            $width = count($frame);
            for($y=0;$y<$width;$y ) {
                for($x=0;$x<$width;$x ) {
                    echo ord($frame[$y][$x]).',';
                }
            }
        }
        
        //------------------------------------------------ ----------------------
        öffentliche statische Funktion markTime($markerId)
        {
            list($usec, $sec) = explosion(" ", microtime());
            $time = ((float)$usec (float)$sec);
            
            if (!isset($GLOBALS['qr_time_bench']))
                $GLOBALS['qr_time_bench'] = array();
            
            $GLOBALS['qr_time_bench'][$markerId] = $time;
        }
        
        //------------------------------------------------ ----------------------
        öffentliche statische Funktion timeBenchmark()
        {
            self::markTime('finish');
        
            $lastTime = 0;
            $startTime = 0;
            $p = 0;

            echo '<table cellpadding="3" cellpacing="1">
                    <thead><tr style="border-bottom:1px solid silver"><td colspan="2" style="text-align:center">BENCHMARK</td></tr>&lt ;/thead>
                    <tbody>';

            foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {
                if ($p > 0) {
                    echo '<tr><th style="text-align:right">till '.$markerId.': </th><td>'.number_format($thisTime-$lastTime, 6). 's</td></tr>';
                } anders {
                    $startTime = $thisTime;
                }
                
                $p ;
                $lastTime = $thisTime;
            }
            
            echo '</tbody><tfoot>
                <tr style="border-top:2px solid black"><th style="text-align:right">TOTAL: </th><td>'.number_format($lastTime-$startTime , 6).'s</td></tr>
            </tfoot>
            </table>';
        }
        
    }//############################################# #########################
    
    QRtools::markTime('start');
    



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




/*
 * PHP-QR-Code-Encoder
 *
 * QR-Code-Spezifikationen
 *
 * Basierend auf der libqrencode C-Bibliothek, die unter LGPL 2.1 vertrieben wird
 * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi <fukuchi@megaui.net>
 *
 * PHP-QR-Code wird unter LGPL 3 vertrieben
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * Die folgenden Daten/Spezifikationen stammen von
 * „Zweidimensionales Symbol – QR-Code – Basisspezifikation“ (JIS X0510:2004)
 *  oder
 * „Automatische Identifikations- und Datenerfassungstechniken – 
 * QR Code 2005 Barcode-Symbologie-Spezifikation“ (ISO/IEC 18004:2006)
 *
 * Bei dieser Bibliothek handelt es sich um freie Software; Sie können es weiterverbreiten und/oder
 * Ändern Sie es gemäß den Bedingungen der GNU Lesser General Public
 * Lizenz wie von der Free Software Foundation veröffentlicht; entweder
 * Version 3 der Lizenz oder eine spätere Version.
 *
 * Diese Bibliothek wird in der Hoffnung verteilt, dass sie nützlich sein wird,
 * jedoch OHNE JEGLICHE GARANTIE; ohne die stillschweigende Garantie von
 * MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU
 *Lesser General Public License für weitere Details.
 *
 * Sie sollten ein Exemplar der GNU Lesser General Public erhalten haben
 * Lizenz zusammen mit dieser Bibliothek; Wenn nicht, schreiben Sie an die Freie Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
 */
 
    define('QRSPEC_VERSION_MAX', 40);
    define('QRSPEC_WIDTH_MAX', 177);

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

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

            for($i=1; $i<= QRSPEC_VERSION_MAX; $i ) {
                $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];
                if($words >= $size) 
                    return $i;
            }

            return -1;
        }
    
        //############################################# ######################
        
        öffentliches statisches $lengthTableBits = array(
            Array(10, 12, 14),
            Array( 9, 11, 13),
            Array( 8, 16, 16),
            Array( 8, 10, 12)
        );
        
        //------------------------------------------------ ----------------------
        öffentliche statische Funktion lengthIndicator($mode, $version)
        {
            if ($mode == QR_MODE_STRUCTURE)
                0 zurückgeben;
                
            if ($version <= 9) {
                $l = 0;
            } else if ($version <= 26) {
                $l = 1;
            } anders {
                $l = 2;
            }

            return self::$lengthTableBits[$mode][$l];
        }
        
        //------------------------------------------------ ----------------------
        öffentliche statische Funktion MaximumWords($mode, $version)
        {
            if($mode == QR_MODE_STRUCTURE) 
                Rückkehr 3;
                
            if($version <= 9) {
                $l = 0;
            } else if($version <= 26) {
                $l = 1;
            } anders {
                $l = 2;
            }

            $bits = self::$lengthTableBits[$mode][$l];
            $words = (1 << $bits) - 1;
            
            if($mode == QR_MODE_KANJI) {
                $words *= 2; // die Anzahl der Bytes ist erforderlich
            }

            return $words;
        }// Fehlerkorrekturcode ------------------------------ --
        // Tabelle des Fehlerkorrekturcodes (Reed-Solomon-Block)
        // Siehe Tabelle 12-16 (S. 30-36), JIS X0510:2004.

        öffentliches statisches $eccTable = array(
            array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)),
            array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1
            array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)),
            array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)),
            array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)),
            array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5
            array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)),
            array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)),
            array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)),
            array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)),
            array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10
            array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)),
            array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)),
            array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)),
            array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)),
            array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15
            array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)),
            array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)),
            array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)),
            array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)),
            array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20
            array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)),
            array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)),
            array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)),
            array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)),
            array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25
            array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)),
            array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)),
            array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)),
            array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)),
            array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30
            array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)),
            array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)),
            array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)),
            array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)),
            array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35
            array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)),
            array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)),
            array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)),
            array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)),
            array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40
        );                                                                       

        //------------------------------------------------ ----------------------
        // CACHEBAR!!!
        
        öffentliche statische Funktion getEccSpec($version, $level, array &$spec)
        {
            if (count($spec) < 5) {
                $spec = array(0,0,0,0,0);
            }

            $b1 = self::$eccTable[$version][$level][0];
            $b2 = self::$eccTable[$version][$level][1];
            $data = self::getDataLength($version, $level);
            $ecc = self::getECCLength($version, $level);

            if($b2 == 0) {
                $spec[0] = $b1;
                $spec[1] = (int)($data / $b1);
                $spec[2] = (int)($ecc / $b1);
                $spec[3] = 0; 
                $spec[4] = 0;
            } anders {
                $spec[0] = $b1;
                $spec[1] = (int)($data / ($b1 $b2));
                $spec[2] = (int)($ecc / ($b1 $b2));
                $spec[3] = $b2;
                $spec[4] = $spec[1] 1;
            }
        }// Ausrichtungsmuster ------------------------------- -----

        // Positionen von Ausrichtungsmustern.
        // Dieses Array enthält nur die zweite und dritte Position des 
        // Ausrichtungsmuster. Der Rest kann aus der Entfernung berechnet werden 
        // zwischen ihnen.
         
        // Siehe Tabelle 1 in Anhang E (S. 71) von JIS X0510:2004.
         
        öffentliches statisches $alignmentPattern = array(      
            Array( 0, 0),
            array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5
            array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10
            array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15
            array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20
            array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25
            array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30
            array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35
            array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40
        );                                                                                  

        
        /**-------------------------------------------------- -------------------
         * Setzen Sie eine Ausrichtungsmarkierung.
         * @param-Frame
         * @param Breite
         * @param ox,oy Mittelpunktkoordinate des Musters*/
        öffentliche statische Funktion putAlignmentMarker(array &$frame, $ox, $oy)
        {
            $finder = array(
                „xa1xa1xa1xa1xa1“,
                „xa1xa0xa0xa0xa1“,
                „xa1xa0xa1xa0xa1“,
                „xa1xa0xa0xa0xa1“,
                „xa1xa1xa1xa1xa1“
            );                        
            
            $yStart = $oy-2;         
            $xStart = $ox-2;
            
            for($y=0; $y<5; $y ) {
                QRstr::set($frame, $xStart, $yStart $y, $finder[$y]);
            }
        }

        //------------------------------------------------ ----------------------
        öffentliche statische Funktion putAlignmentPattern($version, &$frame, $width)
        {
            if($version < 2)
                zurückkehren;

            $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];
            if($d < 0) {
                $w = 2;
            } anders {
                $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d 2);
            }

            if($w * $w - 3 == 1) {
                $x = self::$alignmentPattern[$version][0];
                $y = self::$alignmentPattern[$version][0];
                self::putAlignmentMarker($frame, $x, $y);
                zurückkehren;
            }

            $cx = self::$alignmentPattern[$version][0];
            for($x=1; $x<$w - 1; $x ) {
                self::putAlignmentMarker($frame, 6, $cx);
                self::putAlignmentMarker($frame, $cx, 6);
                $cx = $d;
            }

            $cy = self::$alignmentPattern[$version][0];
            for($y=0; $y<$w-1; $y ) {
                $cx = self::$alignmentPattern[$version][0];
                for($x=0; $x<$w-1; $x ) {
                    self::putAlignmentMarker($frame, $cx, $cy);
                    $cx = $d;
                }
                $cy = $d;
            }
        }

        // Versionsinformationsmuster ---------------------------

		// Versionsinformationsmuster (BCH-codiert).
        // Siehe Tabelle 1 in Anhang D (S. 68) von JIS X0510:2004.
        
		// Größe: [QRSPEC_VERSION_MAX - 6]
		
        öffentliches statisches $versionPattern = array(
            0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d,
            0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9,
            0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75,
            0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64,
            0x27541, 0x28c69
        );

        //------------------------------------------------ ----------------------
        öffentliche statische Funktion getVersionPattern($version)
        {
            if($version < 7 || $version > QRSPEC_VERSION_MAX)
                0 zurückgeben;

            return self::$versionPattern[$version -7];
        }// Formatinformationen ------------------------------- ----
        // Siehe calcFormatInfo in tests/test_qrspec.c (original qrencode c lib)
        
        öffentliches statisches $formatInfo = array(
            Array (0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
            Array (0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
            Array (0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
            Array (0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
        );

        öffentliche statische Funktion getFormatInfo($mask, $level)
        {
            if($mask < 0 || $mask > 7)
                0 zurückgeben;
                
            if($level < 0 || $level > 3)
                0 zurückgeben;                

            return self::$formatInfo[$level][$mask];
        }

        // Rahmen ----------------------------------------------- ----------------
        // Cache der ersten Frames.
         
        öffentliche statische $frames = array();

        /**-------------------------------------------------- -------------------
         * Legen Sie ein Suchmuster fest.
         * @param-Frame
         * @param Breite
         * @param ox,oy obere linke Koordinate des Musters*/
        öffentliche statische Funktion putFinderPattern(&$frame, $ox, $oy)
        {
            $finder = array(
                „xc1xc1xc1xc1xc1xc1xc1“,
                „xc1xc0xc0xc0xc0xc0xc1“,
                „xc1xc0xc1xc1xc1xc0xc1“,
                „xc1xc0xc1xc1xc1xc0xc1“,
                „xc1xc0xc1xc1xc1xc0xc1“,
                „xc1xc0xc0xc0xc0xc0xc1“,
                „xc1xc1xc1xc1xc1xc1xc1“
            );                            
            
            for($y=0; $y<7; $y ) {
                QRstr::set($frame, $ox, $oy $y, $finder[$y]);
            }
        }

        //------------------------------------------------ ----------------------
        öffentliche statische Funktion createFrame($version)
        {
            $width = self::$capacity[$version][QRCAP_WIDTH];
            $frameLine = str_repeat (" ", $width);
            $frame = array_fill(0, $width, $frameLine);

            // Finder-Muster
            self::putFinderPattern($frame, 0, 0);
            self::putFinderPattern($frame, $width - 7, 0);
            self::putFinderPattern($frame, 0, $width - 7);
            
            // Trennzeichen
            $yOffset = $width - 7;
            
            for($y=0; $y<7; $y ) {
                $frame[$y][7] = "xc0";
                $frame[$y][$width - 8] = "xc0";
                $frame[$yOffset][7] = "xc0";
                $yOffset ;
            }
            
            $setPattern = str_repeat("xc0", 8);
            
            QRstr::set($frame, 0, 7, $setPattern);
            QRstr::set($frame, $width-8, 7, $setPattern);
            QRstr::set($frame, 0, $width - 8, $setPattern);
        
            // Formatinformationen
            $setPattern = str_repeat("x84", 9);
            QRstr::set($frame, 0, 8, $setPattern);
            QRstr::set($frame, $width - 8, 8, $setPattern, 8);
            
            $yOffset = $width - 8;

            for($y=0; $y<8; $y ,$yOffset ) {
                $frame[$y][8] = "x84";
                $frame[$yOffset][8] = "x84";
            }

            // Timing-Muster  
            
            for($i=1; $i<$width-15; $i ) {
                $frame[6][7 $i] = chr(0x90 | ($i & 1));
                $frame[7 $i][6] = chr(0x90 | ($i & 1));
            }
            
            // Ausrichtungsmuster  
            self::putAlignmentPattern($version, $frame, $width);
            
            // Versionsinformationen 
            if($version >= 7) {
                $vinf = self::getVersionPattern($version);

                $v = $vinf;
                
                for($x=0; $x<6; $x ) {
                    for($y=0; $y<3; $y ) {
                        $frame[($width - 11) $y][$x] = chr(0x88 ​​| ($v & 1));
                        $v = $v >> 1;
                    }
                }

                $v = $vinf;
                for($y=0; $y<6; $y ) {
                    for($x=0; $x<3; $x ) {
                        $frame[$y][$x ($width - 11)] = chr(0x88 ​​| ($v & 1));
                        $v = $v >> 1;
                    }
                }
            }
    
            // und ein bisschen...  
            $frame[$width - 8][8] = "x81";
            
            return $frame;
        }//------------------------------------------------ ----------------------
        öffentliche statische Funktion debug($frame, $binary_mode = false)
        {
            if ($binary_mode) {
            
                    foreach ($frame as &$frameLine) {
                        $frameLine = join('<span class="m">  </span>', explosion('0', $frameLine));
                        $frameLine = join('██', explosion('1', $frameLine));
                    }
                    
                    ?>
                <Stil>
                    .m { Hintergrundfarbe: weiß; }
                </style>
                <?php
                    echo '<pre class="brush:php;toolbar:false"><tt><br/ ><br/ ><br/ >        ';
                    echo join("<br/ >        ", $frame);
                    echo '</tt>






'; } anders { foreach ($frame as &$frameLine) { $frameLine = join(' ', explosion("xc0", $frameLine)); $frameLine = join('?', explosion("xc1", $frameLine)); $frameLine = join(' ', explosion("xa0", $frameLine)); $frameLine = join('?', explosion("xa1", $frameLine)); $frameLine = join('', explosion("x84", $frameLine)); //Format 0 $frameLine = join('', explosion("x85", $frameLine)); //Format 1 $frameLine = join('?', explosion("x81", $frameLine)); //spezielles Bit $frameLine = join(' ', explosion("x90", $frameLine)); //Uhr 0 $frameLine = join('?', explosion("x91", $frameLine)); //Uhr 1 $frameLine = join(' ', explosion("x88", $frameLine)); //Version $frameLine = join('?', explosion("x89", $frameLine)); //Version $frameLine = join('?', explosion("x01", $frameLine)); $frameLine = join('?', explosion(" ", $frameLine)); } ?> .p { Hintergrundfarbe: gelb; } .m { Hintergrundfarbe: #00FF00; } .s { Hintergrundfarbe: #FF0000; } .c { Hintergrundfarbe: Aqua; } .x { Hintergrundfarbe: rosa; } .f { Hintergrundfarbe: Gold; } <tt>"; echo join("<br/ >", $frame); echo "</tt>"; } } //------------------------------------------------ ---------------------- öffentliche statische Funktion serial($frame) { return gzcompress(join("n", $frame), 9); } //------------------------------------------------ ---------------------- öffentliche statische Funktion unserial($code) { return explosion("n", gzuncompress($code)); }//------------------------------------------------ ---------------------- öffentliche statische Funktion newFrame($version) { if($version < 1 || $version > QRSPEC_VERSION_MAX) null zurückgeben; 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)); } anders { self::$frames[$version] = self::createFrame($version); file_put_contents($fileName, self::serial(self::$frames[$version])); } } anders { self::$frames[$version] = self::createFrame($version); } } if(is_null(self::$frames[$version])) null zurückgeben; return self::$frames[$version]; } //------------------------------------------------ ---------------------- öffentliche statische Funktion rsBlockNum($spec) { return $spec[0] $spec[3]; } öffentliche statische Funktion rsBlockNum1($spec) { return $spec[0]; } öffentliche statische Funktion rsDataCodes1($spec) { return $spec[1]; } öffentliche statische Funktion rsEccCodes1($spec) { return $spec[2]; } öffentliche statische Funktion rsBlockNum2($spec) { return $spec[3]; } öffentliche statische Funktion rsDataCodes2($spec) { return $spec[4]; } öffentliche statische Funktion rsEccCodes2($spec) { return $spec[2]; } öffentliche statische Funktion rsDataLength($spec) { return ($spec[0] * $spec[1]) ($spec[3] * $spec[4]); } öffentliche statische Funktion rsEccLength($spec) { return ($spec[0] $spec[3]) * $spec[2]; } } //---- qrimage.php -------------- /* * PHP-QR-Code-Encoder * * Bildausgabe des Codes mit GD2 * * PHP-QR-Code wird unter LGPL 3 vertrieben * Copyright (C) 2010 Dominik Dzienia * * Bei dieser Bibliothek handelt es sich um freie Software; Sie können es weiterverbreiten und/oder * Ändern Sie es gemäß den Bedingungen der GNU Lesser General Public * Lizenz wie von der Free Software Foundation veröffentlicht; entweder * Version 3 der Lizenz oder eine spätere Version. * * Diese Bibliothek wird in der Hoffnung verteilt, dass sie nützlich sein wird, * jedoch OHNE JEGLICHE GARANTIE; ohne die stillschweigende Garantie von * MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU *Lesser General Public License für weitere Details. * * Sie sollten ein Exemplar der GNU Lesser General Public erhalten haben * Lizenz zusammen mit dieser Bibliothek; Wenn nicht, schreiben Sie an die Freie Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('QR_IMAGE', true); Klasse QRimage { //------------------------------------------------ ---------------------- öffentliche statische Funktion png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4, $saveandprint=FALSE) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("Inhaltstyp: image/png"); ImagePng($image); } anders { if($saveandprint===TRUE){ ImagePng($image, $filename); header("Inhaltstyp: image/png"); ImagePng($image); }anders{ ImagePng($image, $filename); } } ImageDestroy($image); } //------------------------------------------------ ---------------------- öffentliche statische Funktion jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("Inhaltstyp: Bild/JPEG"); ImageJpeg($image, null, $q); } anders { ImageJpeg($image, $filename, $q); } ImageDestroy($image); }//------------------------------------------------ ---------------------- privates statisches Funktionsbild ($frame, $pixelPerPoint = 4, $outerFrame = 4) { $h = count($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<$h; $y ) { for($x=0; $x<$w; $x ) { if ($frame[$y][$x] == '1') { ImageSetPixel($base_image,$x $outerFrame,$y $outerFrame,$col[1]); } } } $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); ImageDestroy($base_image); return $target_image; } } //---- qrinput.php -------------- /* * PHP-QR-Code-Encoder * * Eingabekodierungsklasse * * Basierend auf der libqrencode C-Bibliothek, die unter LGPL 2.1 vertrieben wird * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi * * PHP-QR-Code wird unter LGPL 3 vertrieben * Copyright (C) 2010 Dominik Dzienia * * Bei dieser Bibliothek handelt es sich um freie Software; Sie können es weiterverbreiten und/oder * Ändern Sie es gemäß den Bedingungen der GNU Lesser General Public * Lizenz wie von der Free Software Foundation veröffentlicht; entweder * Version 3 der Lizenz oder eine spätere Version. * * Diese Bibliothek wird in der Hoffnung verteilt, dass sie nützlich sein wird, * jedoch OHNE JEGLICHE GARANTIE; ohne die stillschweigende Garantie von * MARKTGÄNGIGKEIT oder EIGNUNG FÜR EINEN BESTIMMTEN ZWECK. Siehe die GNU *Lesser General Public License für weitere Details. * * Sie sollten ein Exemplar der GNU Lesser General Public erhalten haben * Lizenz zusammen mit dieser Bibliothek; Wenn nicht, schreiben Sie an die Freie Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ define('STRUCTURE_HEADER_BITS', 20); define('MAX_STRUCTURED_SYMBOLS', 16); Klasse QRinputItem { öffentlicher $-Modus; öffentliche $-Größe; öffentliche $Daten; öffentlicher $bstream; öffentliche Funktion __construct($mode, $size, $data, $bstream = null) { $setData = array_slice($data, 0, $size); if (count($setData) < $size) { $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); } if(!QRinput::check($mode, $size, $setData)) { throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); null zurückgeben; } $this->mode = $mode; $this->size = $size; $this->data = $setData; $this->bstream = $bstream; } //------------------------------------------------ ---------------------- öffentliche Funktion encodeModeNum($version) { versuchen { $words = (int)($this->size / 3); $bs = new QRbitstream(); $val = 0x1; $bs->appendNum(4, $val); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); for($i=0; $i<$words; $i ) { $val = (ord($this->data[$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 zurückgeben; } Catch (Ausnahme $e) { return -1; } }//------------------------------------------------ ---------------------- öffentliche Funktion encodeModeAn($version) { versuchen { $words = (int)($this->size / 2); $bs = new QRbitstream(); $bs->appendNum(4, 0x02); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); for($i=0; $i<$words; $i ) { $val = (int)QRinput::lookAnTable(ord($this->data[$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 zurückgeben; } Catch (Ausnahme $e) { return -1; } } //------------------------------------------------ ---------------------- öffentliche Funktion encodeMode8($version) { versuchen { $bs = new QRbitstream(); $bs->appendNum(4, 0x4); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); for($i=0; $i<$this->size; $i ) { $bs->appendNum(8, ord($this->data[$i])); } $this->bstream = $bs; 0 zurückgeben; } Catch (Ausnahme $e) { return -1; } } //------------------------------------------------ ---------------------- öffentliche Funktion encodeModeKanji($version) { versuchen { $bs = new QRbitrtream(); $bs->appendNum(4, 0x8); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); for($i=0; $i<$this->size; $i =2) { $val = (ord($this->data[$i]) << 8) | ord($this->data[$i 1]); if($val <= 0x9ffc) { $val -= 0x8140; } anders { $val -= 0xc140; } $h = ($val >> 8) * 0xc0; $val = ($val & 0xff) $h; $bs->appendNum(13, $val); } $this->bstream = $bs; 0 zurückgeben; } Catch (Ausnahme $e) { return -1; } } //------------------------------------------------ ---------------------- öffentliche Funktion encodeModeStructure() { versuchen { $bs = new 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 zurückgeben; } Catch (Ausnahme $e) { return -1; } } //------------------------------------------------ ---------------------- öffentliche Funktion geschätztBitStreamSizeOfEntry($version) { $bits = 0; if($version == 0) $version = 1; switch($this->mode) { case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); brechen; case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); brechen; case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); brechen; case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; Fall QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; Standard: 0 zurückgeben; } $l = QRspec::lengthIndicator($this->mode, $version); $m = 1 << $l; $num = (int)(($this->size $m - 1) / $m); $bits = $num * (4 $l); $bits zurückgeben; }//------------------------------------------------ ---------------------- öffentliche Funktion encodeBitStream($version) { versuchen { unset($this->bstream); $words = QRspec::maximumWords($this->mode, $version); if($this->size > $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); unset($st1); unset($st2); } anders { $ret = 0; switch($this->mode) { case QR_MODE_NUM: $ret = $this->encodeModeNum($version); brechen; case QR_MODE_AN: $ret = $this->encodeModeAn($version); brechen; case QR_MODE_8: $ret = $this->encodeMode8($version); brechen; case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); brechen; Standard: brechen; } if($ret < 0) return -1; } return $this->bstream->size(); } Catch (Ausnahme $e) { return -1; } } }; //############################################# ######################### Klasse QRinput { öffentliche $items; private $version; private $-Ebene; //------------------------------------------------ ---------------------- öffentliche Funktion __construct($version = 0, $level = QR_ECLEVEL_L) { if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { throw new Exception('Invalid version no'); return NULL; } $this->version = $version; $this->level = $level; } //------------------------------------------------ ---------------------- öffentliche Funktion getVersion() { return $this->version; } //------------------------------------------------ ---------------------- öffentliche Funktion setVersion($version) { if($version < 0 || $version > QRSPEC_VERSION_MAX) { throw new Exception('Invalid version no'); return -1; } $this->version = $version; 0 zurückgeben; } //------------------------------------------------ ---------------------- öffentliche Funktion getErrorCorrectionLevel() { return $this->level; } //------------------------------------------------ ---------------------- öffentliche Funktion setErrorCorrectionLevel($level) { if($level > QR_ECLEVEL_H) { throw new Exception('Invalid ECLEVEL'); return -1; } $this->level = $level; 0 zurückgeben; } //------------------------------------------------ ---------------------- öffentliche Funktion appendEntry(QRinputItem $entry) { $this->items[] = $entry; } //------------------------------------------------ ---------------------- öffentliche Funktion append($mode, $size, $data) { versuchen { $entry = new QRinputItem($mode, $size, $data); $this->items[] = $entry; 0 zurückgeben; } Catch (Ausnahme $e) { return -1; } } //------------------------------------------------ ---------------------- öffentliche Funktion insertStructuredAppendHeader($size, $index, $parity) { if( $size > MAX_STRUCTURED_SYMBOLS ) { neue Ausnahme auslösen('insertStructuredAppendHeader falsche Größe'); }if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { throw new Exception('insertStructuredAppendHeader falscher Index'); } $buf = array($size, $index, $parity); versuchen { $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); array_unshift($this->items, $entry); 0 zurückgeben; } Catch (Ausnahme $e) { return -1; } } //------------------------------------------------ ---------------------- öffentliche Funktion calcParity() { $parität = 0; foreach($this->items as $item) { if($item->mode != QR_MODE_STRUCTURE) { for($i=$item->size-1; $i>=0; $i--) { $parity ^= $item->data[$i]; } } } return $parity; } //------------------------------------------------ ---------------------- öffentliche statische Funktion checkModeNum($size, $data) { for($i=0; $i<$size; $i ) { if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ return false; } } return true; } //------------------------------------------------ ---------------------- öffentliche statische Funktion geschätztBitsModeNum($size) { $w = (int)$size / 3; $bits = $w * 10; switch($size - $w * 3) { Fall 1: $bits = 4; brechen; Fall 2: $bits = 7; brechen; Standard: brechen; } $bits zurückgeben; } //------------------------------------------------ ---------------------- öffentliches statisches $anTable = array( -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 ); //------------------------------------------------ ---------------------- öffentliche statische Funktion lookAnTable($c) { return (($c > 127)?-1:self::$anTable[$c]); } //------------------------------------------------ ---------------------- öffentliche statische Funktion checkModeAn($size, $data) { for($i=0; $i<$size; $i ) { if (self::lookAnTable(ord($data[$i])) == -1) { return false; } } return true; } //------------------------------------------------ ---------------------- öffentliche statische Funktion geschätztBitsModeAn($size) { $w = (int)($size / 2); $bits = $w * 11; if($size & 1) { $bits = 6; } $bits zurückgeben; } //------------------------------------------------ ---------------------- öffentliche statische Funktion geschätztBitsMode8($size) { return $size * 8; } //------------------------------------------------ ---------------------- öffentliche Funktion geschätztBitsModeKanji($size) { return (int)(($size / 2) * 13); } //------------------------------------------------ ---------------------- öffentliche statische Funktion checkModeKanji($size, $data) { if($size & 1) return false; for($i=0; $i<$size; $i =2) { $val = (ord($data[$i]) << 8) | ord($data[$i 1]); if( $val < 0x8140 || ($val > 0x9ffc && $val < 0xe040) || $val > 0xebbf) { return false; } } return true; }/**************************************************** ******************* * Validierung ************************************************** ********************/ öffentliche statische Funktionsprüfung ($mode, $size, $data) { if($size <= 0) return false; switch($mode) { case QR_MODE_NUM: return self::checkModeNum($size, $data); brechen; case QR_MODE_AN: return self::checkModeAn($size, $data); brechen; case QR_MODE_KANJI: return self::checkModeKanji($size, $data); brechen; Fall QR_MODE_8: true zurückgeben; brechen; case QR_MODE_STRUCTURE: true zurückgeben; brechen; Standard: brechen; } return false; } //------------------------------------------------ ---------------------- öffentliche Funktion geschätztBitStreamSize($version) { $bits = 0; foreach($this->items as $item) { $bits = $item->estimateBitStreamSizeOfEntry($version); } $bits zurückgeben; } //------------------------------------------------ ---------------------- öffentliche Funktion „estimateVersion()“ { $version = 0; $prev = 0; Tun { $prev = $version; $bits = $this->estimateBitStreamSize($prev); $version = QRspec::getMinimumVersion((int)(($bits 7) / 8), $this->level); if ($version < 0) { return -1; } } while ($version > $prev); return $version; } //------------------------------------------------ ---------------------- öffentliche statische Funktion lengthOfCode($mode, $version, $bits) { $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); switch($mode) { Fall QR_MODE_NUM: $chunks = (int)($payload / 10); $remain = $payload - $chunks * 10; $size = $chunks * 3; if($remain >= 7) { $size = 2; } else if($remain >= 4) { $größe = 1; } brechen; Fall QR_MODE_AN: $chunks = (int)($payload / 11); $remain = $payload - $chunks * 11; $size = $chunks * 2; if($remain >= 6) $Größe ; brechen; Fall QR_MODE_8: $size = (int)($payload / 8); brechen; Fall QR_MODE_KANJI: $size = (int)(($payload / 13) * 2); brechen; Fall QR_MODE_STRUCTURE: $size = (int)($payload / 8); brechen; Standard: $size = 0; brechen; } $maxsize = QRspec::maximumWords($mode, $version); if($size < 0) $size = 0; if($size > $maxsize) $size = $maxsize; return $size; } //------------------------------------------------ ---------------------- öffentliche Funktion createBitStream() { $to
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn