Heim > Artikel > Backend-Entwicklung > PHP-QR-Code-Generierung
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.'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/>'; ?>
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>< ;/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>