PHP-QR-Code-Generierung
Aug 08, 2016 am 09:32 AMEs 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";//二維碼寫入內(nèi)容 $errorCorrectionLevel = 'L';//錯誤處理級別 $matrixPointSize = 6;//二維碼尺寸大小 //md5加密生成文件名,data可以使用數(shù)據(jù)庫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>
'; } 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)); } ?>

Hei?e KI -Werkzeuge

Undress AI Tool
Ausziehbilder kostenlos

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem v?llig kostenlosen KI-Gesichtstausch-Tool aus!

Hei?er Artikel

Hei?e Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Viele Benutzer werden sich bei der Auswahl von Smartwatches für die Marke Huawei entscheiden. Viele Benutzer sind neugierig auf den Unterschied zwischen Huawei GT3pro und GT4. Was sind die Unterschiede zwischen Huawei GT3pro und GT4? 1. Aussehen GT4: 46 mm und 41 mm, das Material ist Glasspiegel + Edelstahlgeh?use + hochaufl?sende Faserrückschale. GT3pro: 46,6 mm und 42,9 mm, das Material ist Saphirglas + Titangeh?use/Keramikgeh?use + Keramikrückschale 2. Gesundes GT4: Mit dem neuesten Huawei Truseen5.5+-Algorithmus werden die Ergebnisse genauer. GT3pro: EKG-Elektrokardiogramm sowie Blutgef?? und Sicherheit hinzugefügt

Die Verwendung von return in der C-Sprache ist: 1. Für Funktionen, deren Rückgabewerttyp ungültig ist, k?nnen Sie die Rückgabeanweisung verwenden, um die Ausführung der Funktion vorzeitig zu beenden. 2. Für Funktionen, deren Rückgabewerttyp nicht ungültig ist, ist die Funktion von Die Return-Anweisung dient dazu, die Ausführung der Funktion zu beenden. 3. Beenden Sie die Ausführung der Funktion vorzeitig wenn die Funktion keinen Wert zurückgibt.

Warum das Snipping-Tool unter Windows 11 nicht funktioniert Das Verst?ndnis der Grundursache des Problems kann dabei helfen, die richtige L?sung zu finden. Hier sind die h?ufigsten Gründe, warum das Snipping Tool m?glicherweise nicht ordnungsgem?? funktioniert: Focus Assistant ist aktiviert: Dies verhindert, dass das Snipping Tool ge?ffnet wird. Besch?digte Anwendung: Wenn das Snipping-Tool beim Start abstürzt, ist es m?glicherweise besch?digt. Veraltete Grafiktreiber: Inkompatible Treiber k?nnen das Snipping-Tool beeintr?chtigen. St?rungen durch andere Anwendungen: Andere laufende Anwendungen k?nnen mit dem Snipping Tool in Konflikt geraten. Das Zertifikat ist abgelaufen: Ein Fehler w?hrend des Upgrade-Vorgangs kann zu diesem Problem führen. Diese einfache L?sung ist für die meisten Benutzer geeignet und erfordert keine besonderen technischen Kenntnisse. 1. Aktualisieren Sie Windows- und Microsoft Store-Apps

Jedes Jahr bevor Apple eine neue Hauptversion von iOS und macOS ver?ffentlicht, k?nnen Benutzer die Betaversion mehrere Monate im Voraus herunterladen, um sie zuerst zu testen. Da die Software sowohl von der ?ffentlichkeit als auch von Entwicklern verwendet wird, hat Apple für beide Entwickler- und ?ffentliche Versionen herausgebracht, bei denen es sich um ?ffentliche Betaversionen der Entwickler-Betaversionen handelt. Was ist der Unterschied zwischen der Entwicklerversion und der ?ffentlichen Version von iOS? Im wahrsten Sinne des Wortes handelt es sich bei der Entwicklerversion um eine Entwickler-Betaversion und bei der ?ffentlichen Version um eine ?ffentliche Betaversion. Die Entwicklerversion und die ?ffentliche Version richten sich an unterschiedliche Zielgruppen. Die Entwicklerversion wird von Apple zum Testen durch Entwickler verwendet. Sie ben?tigen ein Apple-Entwicklerkonto, um sie herunterzuladen und zu aktualisieren.

Titel: Beispiel für die Verwendung der Array.Sort-Funktion zum Sortieren eines Arrays in C#. Text: In C# ist Array eine h?ufig verwendete Datenstruktur, und h?ufig sind Array-Sortiervorg?nge erforderlich. C# stellt die Array-Klasse bereit, die über die Sort-Methode verfügt, um Arrays bequem zu sortieren. In diesem Artikel wird gezeigt, wie Sie ein Array mithilfe der Array.Sort-Funktion in C# sortieren, und es werden spezifische Codebeispiele bereitgestellt. Zun?chst müssen wir die grundlegende Verwendung der Array.Sort-Funktion verstehen. Array.So

Quellcode: publicclassReturnFinallyDemo{publicstaticvoidmain(String[]args){System.out.println(case1());}publicstaticintcase1(){intx;try{x=1;returnx;}finally{x=3;}}}# Ausgabe Die Ausgabe des obigen Codes kann einfach zu dem Schluss kommen: return wird ausgeführt, bevor wir uns schlie?lich ansehen, was auf der Bytecode-Ebene passiert. Im Folgenden wird ein Teil des Bytecodes der Methode case1 abgefangen und mit dem Quellcode verglichen, um die Bedeutung jeder Anweisung darin zu kommentieren

Beim Programmieren in PHP müssen wir h?ufig Arrays zusammenführen. PHP stellt die Funktion array_merge() bereit, um die Array-Zusammenführung abzuschlie?en. Wenn jedoch derselbe Schlüssel im Array vorhanden ist, überschreibt diese Funktion den ursprünglichen Wert. Um dieses Problem zu l?sen, stellt PHP in der Sprache auch eine Funktion array_merge_recursive() bereit, die Arrays zusammenführen und die Werte derselben Schlüssel beibehalten kann, wodurch das Programmdesign flexibler wird. array_merge

In PHP gibt es viele leistungsstarke Array-Funktionen, die Array-Operationen komfortabler und schneller machen k?nnen. Wenn wir zwei Arrays zu einem assoziativen Array kombinieren müssen, k?nnen wir diese Operation mit der Funktion array_combine von PHP ausführen. Diese Funktion wird tats?chlich verwendet, um die Schlüssel eines Arrays als Werte eines anderen Arrays zu einem neuen assoziativen Array zu kombinieren. Als n?chstes erkl?ren wir, wie man die Funktion array_combine in PHP verwendet, um zwei Arrays zu einem assoziativen Array zu kombinieren. Erfahren Sie mehr über array_comb
