>백엔드 개발 >PHP 튜토리얼 >PHP QR 코드 생성

PHP QR 코드 생성

WBOY
WBOY원래의
2016-08-08 09:32:411546검색

QR 코드를 생성하는 방법에는 여러 가지가 있으며, 가장 빠른 방법은 Google API를 사용하는 것입니다. 구글이 차단되어 잘 작동하지 않는 경우가 많아 안타깝습니다. 이제 좀 더 유용한 방법에 대해 이야기해 보겠습니다.

자세한 문서와 코드를 보려면 http://phpqrcode.sourceforge.net/을 방문하세요.

다음은 작성된 정보를 기반으로 자동으로 QR 코드를 생성하는 단순화된 버전입니다. 그리고 지정된 디렉토리에 저장합니다.

기본 프로그램 코드

		<?php
       
		include "./phpqrcode/qrcode.php";   //导入主文件 
	    $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.&#39;qrcode&#39;.DIRECTORY_SEPARATOR;//文件保存目录
    	$PNG_WEB_DIR = &#39;qrcode/&#39;;//用于预览
    	if (!file_exists($PNG_TEMP_DIR))
        	mkdir($PNG_TEMP_DIR);
        $data = "test";//二维码写入内容
        
        $errorCorrectionLevel = &#39;L&#39;;//错误处理级别
        
        $matrixPointSize = 6;//二维码尺寸大小
        //md5加密生成文件名,data可以使用数据库id或者其他唯一标识符
        $filename = $PNG_TEMP_DIR.md5($data.&#39;|&#39;.$errorCorrectionLevel.&#39;|&#39;.$matrixPointSize).&#39;.png&#39;;
        //使用QRcode类生成二维码,文件保存在PNG_TEMP_DIR下
        QRcode::png($data, $filename, $errorCorrectionLevel, $matrixPointSize, 2); 
        //图片预览
         echo &#39;<img src="&#39;.$PNG_WEB_DIR.basename($filename).&#39;" /><hr/>';  
        ?>

첨부 파일을 추가할 수 없어 다음 코드를 붙여넣어야 합니다. . . 다음의 긴 코드를 새 파일에 복사하고 이름을 qrcode.php로 지정하세요. 위 코드를 실행하여 QR 코드를 생성하세요. . . .

생성된 QR 코드 2개 게시


php 클래스 파일(http://phpqrcode.sourceforge.net /에서)

<?php /*
 * PHP QR 코드 인코더
 *
 * 이 파일에는 PHP QR 코드 라이브러리의 MERGED 버전이 포함되어 있습니다.
 * 귀하의 편의를 위해 정식 버전에서 자동 생성되었습니다.
 *
 * 이 병합 버전은 외부 파일이 필요하지 않도록 구성되었으며,
 * 비활성화된 캐시, 오류 로깅 및 더 약하지만 더 빠른 마스크 일치.
 * 튜닝이 필요한 경우 병합되지 않은 버전을 사용하세요.
 *
 * 정식 버전, 문서, 사용 예를 보려면 다음 사이트를 방문하세요.
 *
 * http://phpqrcode.sourceforge.net/
 * https://sourceforge.net/projects/phpqrcode/
 *
 * PHP QR 코드는 LGPL 3에 따라 배포됩니다.
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 이 라이브러리는 무료 소프트웨어입니다. 재배포할 수 있으며/또는
 * GNU Lesser General Public의 조건에 따라 수정합니다.
 * 자유 소프트웨어 재단(Free Software Foundation)이 게시한 라이센스입니다. 어느 하나
 * 라이센스 버전 3 또는 이후 버전.
 *
 * 본 라이브러리는 유용하게 활용되길 바라는 마음으로 배포되며,
 * 그러나 어떠한 보증도 제공되지 않습니다. 묵시적인 보증조차 없이
 * 특정 목적에 대한 상품성 또는 적합성. GNU 보기
 * 자세한 내용은 약소 일반 공중 라이선스를 참조하세요.
 *
 * 당신은 GNU Lesser General Public의 사본을 받았어야 합니다.
 * 이 라이브러리와 함께 라이센스를 받습니다. 그렇지 않다면 자유 소프트웨어에 쓰십시오.
 * Foundation, Inc., 51 Franklin St, 5층, Boston, MA 02110-1301 USA
 */
 
 

/*
 * 버전: 1.1.4
 * 빌드: 2010100721
 */



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





/*
 * PHP QR 코드 인코더
 *
 * 공통 상수
 *
 * LGPL 2.1에 배포되는 libqrencode C 라이브러리 기반
 * 저작권(C) 2006, 2007, 2008, 2009 후쿠치 켄타로 <fukuchi@megaui.net>
 *
 * PHP QR 코드는 LGPL 3에 따라 배포됩니다.
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 이 라이브러리는 무료 소프트웨어입니다. 재배포할 수 있으며/또는
 * GNU Lesser General Public의 조건에 따라 수정합니다.
 * 자유 소프트웨어 재단(Free Software Foundation)이 게시한 라이센스입니다. 어느 하나
 * 라이센스 버전 3 또는 이후 버전.
 *
 * 본 라이브러리는 유용하게 활용되길 바라는 마음으로 배포되며,
 * 그러나 어떠한 보증도 제공되지 않습니다. 묵시적인 보증도 없이
 * 특정 목적에 대한 상품성 또는 적합성. GNU 보기
 * 자세한 내용은 약소 일반 공중 라이선스를 참조하세요.
 *
 * 당신은 GNU Lesser General Public의 사본을 받았어야 합니다.
 * 이 라이브러리와 함께 라이센스를 받습니다. 그렇지 않다면 자유 소프트웨어에 쓰십시오.
 * Foundation, Inc., 51 Franklin St, 5층, Boston, MA 02110-1301 USA
 */
 
	// 인코딩 모드
	 
	정의('QR_MODE_NUL', -1);
	정의('QR_MODE_NUM', 0);
	정의('QR_MODE_AN', 1);
	정의('QR_MODE_8', 2);
	정의('QR_MODE_KANJI', 3);
	정의('QR_MODE_STRUCTURE', 4);

	// 오류 수정 수준.

	정의('QR_ECLEVEL_L', 0);
	정의('QR_ECLEVEL_M', 1);
	정의('QR_ECLEVEL_Q', 2);
	정의('QR_ECLEVEL_H', 3);
	
	// 지원되는 출력 형식
	
	정의('QR_FORMAT_TEXT', 0);
	정의('QR_FORMAT_PNG', 1);
	
	클래스 qrstr {
		공개 정적 함수 세트(&$srctab, $x, $y, $repl, $replLen = false) {
			$srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false) ?$replLen:strlen($repl));
		}
	}//---- merged_config.php ----------------




/*
 * PHP QR 코드 인코더
 *
 * 구성 파일, 병합된 버전에 맞게 조정됨
 */
     
    정의('QR_CACHEABLE', false);       // 캐시 사용 - 더 많은 디스크 읽기가 이루어지지만 CPU 성능, 마스크 및 형식 템플릿이 저장됩니다.
    정의('QR_CACHE_DIR', false);       // QR_CACHEABLE === true일 때 사용됩니다.
    정의('QR_LOG_DIR', false);         // 기본 오류 로그 디렉토리   
    
    정의('QR_FIND_BEST_MASK', 참);                                                          // true인 경우 최상의 마스크를 추정합니다(사양 기본값이지만 매우 느립니다. 상당한 성능 향상을 위해 false로 설정하지만 (아마도) 최악의 품질 코드)
    정의('QR_FIND_FROM_RANDOM', 2);                                                       // false인 경우 사용 가능한 모든 마스크를 확인하고, 그렇지 않은 경우 값은 확인해야 하는 마스크 수를 알려주며 마스크 ID는 무작위로 가져옵니다.
    정의('QR_DEFAULT_MASK', 2);                                                               // QR_FIND_BEST_MASK === false인 경우
                                                  
    정의('QR_PNG_MAXIMUM_SIZE', 1024);                                                       // 허용되는 최대 png 이미지 너비(픽셀 단위), GD와 PHP가 이러한 큰 이미지를 처리할 수 있도록 조정합니다.
                                                  



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




/*
 * PHP QR 코드 인코더
 *
 * 도구 세트, 편리한 디버그 유틸리티.
 *
 * PHP QR 코드는 LGPL 3에 따라 배포됩니다.
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 이 라이브러리는 무료 소프트웨어입니다. 재배포할 수 있으며/또는
 * GNU Lesser General Public의 조건에 따라 수정합니다.
 * 자유 소프트웨어 재단(Free Software Foundation)이 게시한 라이센스입니다. 어느 하나
 * 라이센스 버전 3 또는 이후 버전.
 *
 * 본 라이브러리는 유용하게 활용되길 바라는 마음으로 배포되며,
 * 그러나 어떠한 보증도 제공되지 않습니다. 묵시적인 보증도 없이
 * 특정 목적에 대한 상품성 또는 적합성. GNU 보기
 * 자세한 내용은 약소 일반 공중 라이선스를 참조하세요.
 *
 * 당신은 GNU Lesser General Public의 사본을 받았어야 합니다.
 * 이 라이브러리와 함께 라이센스를 받습니다. 그렇지 않다면 자유 소프트웨어에 쓰십시오.
 * Foundation, Inc., 51 Franklin St, 5층, Boston, MA 02110-1301 USA
 */

    클래스 QRtools {
    
        //------------------------------------------------ ---------
        공개 정적 함수 이진화($frame)
        {
            $len = 개수($프레임);
            foreach($frame을 &$frameLine으로) {
                
                for($i=0; $i<$len; $i++) {
                    $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';
                }
            }
            
            $프레임을 반환합니다.
        }
        
        //------------------------------------------------ ---------
        공개 정적 함수 tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037')
        {
            $barcode_array = 배열();
            
            if (!is_array($mode))
                $mode = 폭발(',', $mode);
                
            $ecc레벨 = 'L';
                
            if (count($mode) > 1) {
                $ecc레벨 = $모드[1];
            }
                
            $qrTab = QRcode::text($code, false, $eccLevel);
            $size = 개수($qrTab);
                
            $barcode_array['num_rows'] = $size;
            $barcode_array['num_cols'] = $size;
            $barcode_array['bcode'] = 배열();
                
            foreach($qrTab을 $line으로) {
                $arrAdd = 배열();
                foreach(str_split($line)을 $char로)
                    $arrAdd[] = ($char=='1')?1:0;
                $barcode_array['bcode'][] = $arrAdd;
            }
                    
            $barcode_array를 반환합니다.
        }
        
        //------------------------------------------------ ---------
        공개 정적 함수 ClearCache()
        {
            self::$frames = 배열();
        }
        
        //------------------------------------------------ ---------
        공개 정적 함수 buildCache()
        {
			QRtools::markTime('before_build_cache');
			
			$mask = 새로운 QRmask();
            for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) {
                $frame = QRspec::newFrame($a);
                만약 (QR_IMAGE) {
                    $fileName = QR_CACHE_DIR.'frame_'.$a.'.png';
                    QRimage::png(self::binarize($frame), $fileName, 1, 0);
                }
				
				$너비 = 개수($프레임);
				$bitMask = array_fill(0, $width, array_fill(0, $width, 0));
				($maskNo=0; $maskNo<8; $maskNo++)에 대해
					$mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true);
            }QRtools::markTime('after_build_cache');
        }

        //------------------------------------------------ ---------
        공개 정적 함수 로그($outfile, $err)
        {
            if (QR_LOG_DIR !== false) {
                if ($err != '') {
                    if ($outfile !== false) {
                        file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
                    } 또 다른 {
                        file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);
                    }
                }    
            }
        }
        
        //------------------------------------------------ ---------
        공개 정적 함수 dumpMask($frame) 
        {
            $너비 = 개수($프레임);
            for($y=0;$y<$width;$y++) {
                for($x=0;$x<$width;$x++) {
                    echo ord($frame[$y][$x]).',';
                }
            }
        }
        
        //------------------------------------------------ ---------
        공개 정적 함수 markTime($markerId)
        {
            list($usec, $sec) = 폭발(" ", 마이크로타임());
            $time = ((float)$usec + (float)$sec);
            
            if (!isset($GLOBALS['qr_time_bench']))
                $GLOBALS['qr_time_bench'] = 배열();
            
            $GLOBALS['qr_time_bench'][$markerId] = $time;
        }
        
        //------------------------------------------------ ---------
        공개 정적 함수 timeBenchmark()
        {
            self::markTime('마침');
        
            $마지막 시간 = 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>< ;/머리>
                    <본체>';

            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>';
                } 또 다른 {
                    $startTime = $thisTime;
                }
                
                $p++;
                $lastTime = $thisTime;
            }
            
            echo '</tbody><tfoot>
                <tr style="border-top:2px solid black"><th style="text-align:right">총계: </th><td>'.number_format($lastTime-$startTime , 6).'s</td></tr>
            </tfoot>
            </테이블>';
        }
        
    }//############################################ #########################
    
    QRtools::markTime('시작');
    



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




/*
 * PHP QR 코드 인코더
 *
 * QR코드 사양
 *
 * LGPL 2.1에 배포되는 libqrencode C 라이브러리 기반
 * 저작권(C) 2006, 2007, 2008, 2009 후쿠치 켄타로 <fukuchi@megaui.net>
 *
 * PHP QR 코드는 LGPL 3에 따라 배포됩니다.
 * Copyright (C) 2010 Dominik Dzienia <deltalab at poczta dot fm>
 *
 * 다음 데이터/사양은 다음에서 가져왔습니다.
 * "2차원 기호 - QR 코드 - 기본 사양"(JIS X0510:2004)
 *  또는
 * "자동 식별 및 데이터 캡처 기술 -- 
 * QR Code 2005 바코드 기호 사양"(ISO/IEC 18004:2006)
 *
 * 이 라이브러리는 무료 소프트웨어입니다. 재배포할 수 있으며/또는
 * GNU Lesser General Public의 조건에 따라 수정합니다.
 * 자유 소프트웨어 재단(Free Software Foundation)이 게시한 라이센스입니다. 어느 하나
 * 라이센스 버전 3 또는 이후 버전.
 *
 * 본 라이브러리는 유용하게 활용되길 바라는 마음으로 배포되며,
 * 그러나 어떠한 보증도 제공되지 않습니다. 묵시적인 보증조차 없이
 * 특정 목적에 대한 상품성 또는 적합성. GNU 보기
 * 자세한 내용은 약소 일반 공중 라이선스를 참조하세요.
 *
 * 당신은 GNU Lesser General Public의 사본을 받았어야 합니다.
 * 이 라이브러리와 함께 라이센스를 받습니다. 그렇지 않다면 자유 소프트웨어에 쓰십시오.
 * Foundation, Inc., 51 Franklin St, 5층, Boston, MA 02110-1301 USA
 */
 
    정의('QRSPEC_VERSION_MAX', 40);
    정의('QRSPEC_WIDTH_MAX', 177);

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

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

            for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) {
                $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level];
                if($단어 >= $size) 
                    $i를 반환합니다.
            }

            -1을 반환합니다.
        }
    
        //############################################ ######################
        
        공개 정적 $lengthTableBits = 배열(
            배열(10, 12, 14),
            배열(9, 11, 13),
            배열(8, 16, 16),
            배열(8, 10, 12)
        );
        
        //------------------------------------------------ ---------
        공개 정적 함수 길이 표시기($mode, $version)
        {
            if ($mode == QR_MODE_STRUCTURE)
                0을 반환합니다.
                
            if ($version <= 9) {
                $1 = 0;
            } else if ($version <= 26) {
                $1 = 1;
            } 또 다른 {
                $1 = 2;
            }

            return self::$lengthTableBits[$mode][$l];
        }
        
        //------------------------------------------------ ---------
        공개 정적 함수 maximumWords($mode, $version)
        {
            if($mode == QR_MODE_STRUCTURE) 
                3을 반환합니다.
                
            if($version <= 9) {
                $1 = 0;
            } else if($version <= 26) {
                $1 = 1;
            } 또 다른 {
                $1 = 2;
            }

            $bits = self::$lengthTableBits[$mode][$l];
            $words = (1 << $bits) - 1;
            
            if($mode == QR_MODE_KANJI) {
                $단어 *= 2; // 바이트 수가 필요합니다.
            }

            $words를 반환합니다.
        }// 오류 수정 코드 --------------------------------- --
        // 오류 정정 코드 표(리드-솔로몬 블록)
        // 표 12-16 (pp.30-36), JIS X0510:2004 참조.

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

        //------------------------------------------------ ---------
        // 캐시 가능!!!
        
        공개 정적 함수 getEccSpec($version, $level, array &$spec)
        {
            if (count($spec) < 5) {
                $spec = 배열(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;
            } 또 다른 {
                $spec[0] = $b1;
                $spec[1] = (int)($data / ($b1 + $b2));
                $spec[2] = (int)($ecc / ($b1 + $b2));
                $spec[3] = $b2;
                $spec[4] = $spec[1] + 1;
            }
        }// 정렬 패턴 --------------------------------- -----

        // 정렬 패턴의 위치.
        // 이 배열에는 두 번째와 세 번째 위치만 포함됩니다. 
        // 정렬 패턴. 나머지는 거리에서 계산할 수 있습니다. 
        // 그 사이.
         
        // JIS X0510:2004 부록 E(pp.71)의 표 1을 참조하세요.
         
        공개 정적 $alignmentPattern = 배열(      
            배열(0, 0),
            배열(0, 0), 배열(18, 0), 배열(22, 0), 배열(26, 0), 배열(30, 0), // 1- 5
            배열(34, 0), 배열(22, 38), 배열(24, 42), 배열(26, 46), 배열(28, 50), // 6-10
            배열(30, 54), 배열(32, 58), 배열(34, 62), 배열(26, 46), 배열(26, 48), //11-15
            배열(26, 50), 배열(30, 54), 배열(30, 56), 배열(30, 58), 배열(34, 62), //16-20
            배열(28, 50), 배열(26, 50), 배열(30, 54), 배열(28, 54), 배열(32, 58), //21-25
            배열(30, 58), 배열(34, 62), 배열(26, 50), 배열(30, 54), 배열(26, 52), //26-30
            배열(30, 56), 배열(34, 60), 배열(30, 58), 배열(34, 62), 배열(30, 54), //31-35
            배열(24, 50), 배열(28, 54), 배열(32, 58), 배열(26, 54), 배열(30, 58), //35-40
        );                                                                                  

        
        /**------------------------------------- ------------------
         * 정렬 마커를 놓습니다.
         * @param 프레임
         * @param 너비
         * @param ox,oy 패턴의 중심 좌표*/
        공개 정적 함수 putAlignmentMarker(배열 &$frame, $ox, $oy)
        {
            $파인더 = 배열(
                "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]);
            }
        }

        //------------------------------------------------ ---------
        공개 정적 함수 putAlignmentPattern($version, &$frame, $width)
        {
            if($version < 2)
                반품;

            $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];
            if($d < 0) {
                $w = 2;
            } 또 다른 {
                $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);
                반품;
            }

            $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;
            }
        }

        // 버전 정보 패턴 ----------------------------

		// 버전 정보 패턴(BCH 코딩)입니다.
        // JIS X0510:2004 부록 D(pp.68)의 표 1을 참조하세요.
        
		// 크기: [QRSPEC_VERSION_MAX - 6]
		
        공개 정적 $versionPattern = 배열(
            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
        );

        //------------------------------------------------ ---------
        공개 정적 함수 getVersionPattern($version)
        {
            if($version < 7 || $version > QRSPEC_VERSION_MAX)
                0을 반환합니다.

            return self::$versionPattern[$version -7];
        }// 형식 정보 --------------------------------- ----
        //tests/test_qrspec.c의 calcFormatInfo를 참조하세요(원본 qrencode c lib)
        
        공개 정적 $formatInfo = 배열(
            배열(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976),
            배열(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0),
            배열(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed),
            배열(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b)
        );

        공개 정적 함수 getFormatInfo($mask, $level)
        {
            if($mask  7)
                0을 반환합니다.
                
            if($레벨  3)
                0을 반환합니다.                

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

        // 액자 ----------------------------------------------- ----------------
        // 초기 프레임의 캐시.
         
        공개 정적 $프레임 = 배열();

        /**------------------------------------- ------------------
         * 파인더 패턴을 넣습니다.
         * @param 프레임
         * @param 너비
         * @param ox,oy 패턴의 왼쪽 위 좌표*/
        공개 정적 함수 putFinderPattern(&$frame, $ox, $oy)
        {
            $파인더 = 배열(
                "xc1xc1xc1xc1xc1xc1xc1",
                "xc1xc0xc0xc0xc0xc0xc1",
                "xc1xc0xc1xc1xc1xc0xc1",
                "xc1xc0xc1xc1xc1xc0xc1",
                "xc1xc0xc1xc1xc1xc0xc1",
                "xc1xc0xc0xc0xc0xc0xc1",
                "xc1xc1xc1xc1xc1xc1xc1"
            );                            
            
            for($y=0; $y<tt>";
                echo Join("<br/ >", $frame);
                echo "</tt>
"; } } //------------------------------------------------ --------- 공개 정적 함수 직렬($frame) { return gzcompress(join("n", $frame), 9); } //------------------------------------------------ --------- 공개 정적 함수 unserial($code) { returnexplore("n", gzuncompress($code)); }//------------------------------------------------ --------- 공개 정적 함수 newFrame($version) { if($version < 1 || $version > QRSPEC_VERSION_MAX) null을 반환; if(!isset(self::$frames[$version])) { $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; if (QR_CACHEABLE) { if (file_exists($fileName)) { self::$frames[$version] = self::unserial(file_get_contents($fileName)); } 또 다른 { self::$frames[$version] = self::createFrame($version); file_put_contents($fileName, self::serial(self::$frames[$version])); } } 또 다른 { self::$frames[$version] = self::createFrame($version); } } if(is_null(self::$frames[$version])) null을 반환; return self::$frames[$version]; } //------------------------------------------------ --------- 공개 정적 함수 rsBlockNum($spec) { return $spec[0] + $spec[3]; } 공개 정적 함수 rsBlockNum1($spec) { return $spec[0]; } 공개 정적 함수 rsDataCodes1($spec) { return $spec[1]; } 공개 정적 함수 rsEccCodes1($spec) { return $spec[2]; } 공개 정적 함수 rsBlockNum2($spec) { return $spec[3]; } 공개 정적 함수 rsDataCodes2($spec) { return $spec[4]; } 공개 정적 함수 rsEccCodes2($spec) { return $spec[2]; } 공개 정적 함수 rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } 공개 정적 함수 rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } } //---- qrimage.php ---------------- /* * PHP QR 코드 인코더 * * GD2를 이용한 코드의 이미지 출력 * * PHP QR 코드는 LGPL 3에 따라 배포됩니다. * Copyright (C) 2010 Dominik Dzienia * * 이 라이브러리는 무료 소프트웨어입니다. 재배포할 수 있으며/또는 * GNU Lesser General Public의 조건에 따라 수정합니다. * 자유 소프트웨어 재단(Free Software Foundation)이 게시한 라이센스입니다. 어느 하나 * 라이센스 버전 3 또는 이후 버전. * * 본 라이브러리는 유용하게 활용되길 바라는 마음으로 배포되며, * 그러나 어떠한 보증도 제공되지 않습니다. 묵시적인 보증조차 없이 * 특정 목적에 대한 상품성 또는 적합성. GNU 보기 * 자세한 내용은 약소 일반 공중 라이선스를 참조하세요. * * 당신은 GNU Lesser General Public의 사본을 받았어야 합니다. * 이 라이브러리와 함께 라이센스를 받습니다. 그렇지 않다면 자유 소프트웨어에 쓰십시오. * Foundation, Inc., 51 Franklin St, 5층, Boston, MA 02110-1301 USA */ 정의('QR_IMAGE', true); 클래스 QRimage { //------------------------------------------------ --------- 공개 정적 함수 png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("콘텐츠 유형: 이미지/png"); ImagePng($이미지); } 또 다른 { if($saveandprint===TRUE){ ImagePng($이미지, $파일이름); header("콘텐츠 유형: 이미지/png"); ImagePng($이미지); }또 다른{ ImagePng($이미지, $파일이름); } } ImageDestroy($이미지); } //------------------------------------------------ --------- 공개 정적 함수 jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) { $image = self::image($frame, $pixelPerPoint, $outerFrame); if ($filename === false) { Header("콘텐츠 유형: image/jpeg"); ImageJpeg($image, null, $q); } 또 다른 { ImageJpeg($image, $filename, $q); } ImageDestroy($이미지); }//------------------------------------------------ --------- 개인 정적 함수 이미지($frame, $pixelPerPoint = 4, $outerFrame = 4) { $h = 개수($프레임); $w = strlen($frame[0]); $imgW = $w + 2*$outerFrame; $imgH = $h + 2*$outerFrame; $base_image =이미지 생성($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; $ysize = $size; $this->data = $setData; $this->bstream = $bstream; } //------------------------------------------------ --------- 공개 함수 encodeModeNum($version) { 노력하다 { $words = (int)($this->size / 3); $bs = 새로운 QRbitstream(); $발 = 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을 반환합니다. } 잡기(예외 $e) { -1을 반환합니다. } }//------------------------------------------------ --------- 공개 함수 encodeModeAn($version) { 노력하다 { $words = (int)($this->size / 2); $bs = 새로운 QRbitstream(); $bs->appendNum(4, 0x02); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); for($i=0; $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을 반환합니다. } 잡기(예외 $e) { -1을 반환합니다. } } //------------------------------------------------ --------- 공개 함수 encodeMode8($version) { 노력하다 { $bs = 새로운 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을 반환합니다. } 잡기(예외 $e) { -1을 반환합니다. } } //------------------------------------------------ --------- 공용 함수 encodeModeKanji($version) { 노력하다 { $bs = 새로운 QRbitrtream(); $bs->appendNum(4, 0x8); $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); for($i=0; $i<$this->size; $i+=2) { $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); if($val <= 0x9ffc) { $val -= 0x8140; } 또 다른 { $val -= 0xc140; } $h = ($val >> 8) * 0xc0; $val = ($val & 0xff) + $h; $bs->appendNum(13, $val); } $this->bstream = $bs; 0을 반환합니다. } 잡기(예외 $e) { -1을 반환합니다. } } //------------------------------------------------ --------- 공개 함수 encodeModeStructure() { 노력하다 { $bs = 새로운 QRbitstream(); $bs->appendNum(4, 0x03); $bs->appendNum(4, ord($this->data[1]) - 1); $bs->appendNum(4, ord($this->data[0]) - 1); $bs->appendNum(8, ord($this->data[2])); $this->bstream = $bs; 0을 반환합니다. } 잡기(예외 $e) { -1을 반환합니다. } } //------------------------------------------------ --------- 공개 함수 estimateBitStreamSizeOfEntry($version) { $비트 = 0; if($버전 == 0) $버전 = 1; 스위치($this->모드) { 케이스 QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); 부서지다; 케이스 QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); 부서지다; 케이스 QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); 부서지다; 사례 QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; 사례 QR_MODE_STRUCTURE: STRUCTURE_HEADER_BITS를 반환합니다. 기본: 0을 반환합니다. } $l = QRspec::lengthIndicator($this->mode, $version); $m = 1 << $l; $num = (int)(($this->size + $m - 1) / $m); $비트 += $num * (4 + $l); $비트를 반환합니다. }//------------------------------------------------ --------- 공개 함수 encodeBitStream($version) { 노력하다 { 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 = 새로운 QRbitstream(); $this->bstream->append($st1->bstream); $this->bstream->append($st2->bstream); 설정 해제($st1); 설정 해제($st2); } 또 다른 { $ret = 0; 스위치($this->모드) { 케이스 QR_MODE_NUM: $ret = $this->encodeModeNum($version); 부서지다; 케이스 QR_MODE_AN: $ret = $this->encodeModeAn($version); 부서지다; 케이스 QR_MODE_8: $ret = $this->encodeMode8($version); 부서지다; 사례 QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; 케이스 QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); 부서지다; 기본: 부서지다; } if($ret QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { throw new Exception('잘못된 버전 번호'); NULL을 반환합니다. } $this->버전 = $버전; $this->레벨 = $레벨; } //------------------------------------------------ --------- 공개 함수 getVersion() { $this->버전을 반환합니다. } //------------------------------------------------ --------- 공개 함수 setVersion($version) { if($version < 0 || $version > QRSPEC_VERSION_MAX) { throw new Exception('잘못된 버전 번호'); -1을 반환합니다. } $this->버전 = $버전; 0을 반환합니다. } //------------------------------------------------ --------- 공용 함수 getErrorCorrectionLevel() { $this->레벨을 반환합니다. } //------------------------------------------------ --------- 공용 함수 setErrorCorrectionLevel($level) { if($level > QR_ECLEVEL_H) { 새로운 예외 발생('잘못된 ECLEVEL'); -1을 반환합니다. } $this->레벨 = $레벨; 0을 반환합니다. } //------------------------------------------------ --------- 공용 함수 AppendEntry(QRinputItem $entry) { $this->items[] = $entry; } //------------------------------------------------ --------- 공용 함수 추가($mode, $size, $data) { 노력하다 { $entry = new QRinputItem($mode, $size, $data); $this->items[] = $entry; 0을 반환합니다. } 잡기(예외 $e) { -1을 반환합니다. } } //------------------------------------------------ --------- 공용 함수 insertStructuredAppendHeader($size, $index, $parity) { if( $size > MAX_STRUCTURED_SYMBOLS ) { 새로운 예외 발생('insertStructuredAppendHeader 잘못된 크기'); }if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { 새로운 예외 발생('insertStructuredAppendHeader 잘못된 인덱스'); } $buf = 배열($size, $index, $parity); 노력하다 { $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); array_unshift($this->items, $entry); 0을 반환합니다. } 잡기(예외 $e) { -1을 반환합니다. } } //------------------------------------------------ --------- 공개 함수 calcParity() { $패리티 = 0; foreach($this->항목을 $item으로) { if($item->모드 != QR_MODE_STRUCTURE) { for($i=$item->size-1; $i>=0; $i--) { $패리티 ^= $item->데이터[$i]; } } } $패리티를 반환합니다. } //------------------------------------------------ --------- 공개 정적 함수 checkModeNum($size, $data) { for($i=0; $i<$size; $i++) { if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ 거짓을 반환; } } 사실을 반환; } //------------------------------------------------ --------- 공개 정적 함수 estimateBitsModeNum($size) { $w = (int)$size / 3; $비트 = $w * 10; 스위치($size - $w * 3) { 사례 1: $비트 += 4; 부서지다; 사례 2: $비트 += 7; 부서지다; 기본: 부서지다; } $비트를 반환합니다. } //------------------------------------------------ --------- 공개 정적 $anTable = 배열( -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, -1장, 10장, 11장, 12장, 13장, 14장, 15장, 16장, 17장, 18장, 19장, 20장, 21장, 22장, 23장, 24장, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 ); //------------------------------------------------ --------- 공개 정적 함수 lookAnTable($c) { return (($c > 127)?-1:self::$anTable[$c]); } //------------------------------------------------ --------- 공개 정적 함수 checkModeAn($size, $data) { for($i=0; $i<$size; $i++) { if (self::lookAnTable(ord($data[$i])) == -1) { 거짓을 반환; } } 사실을 반환; } //------------------------------------------------ --------- 공개 정적 함수 estimateBitsModeAn($size) { $w = (int)($size / 2); $비트 = $w * 11; if($size & 1) { $비트 += 6; } $비트를 반환합니다. } //------------------------------------------------ --------- 공개 정적 함수 estimateBitsMode8($size) { $size * 8을 반환합니다. } //------------------------------------------------ --------- 공개 함수 estimateBitsModeKanji($size) { return (int)(($size / 2) * 13); } //------------------------------------------------ --------- 공개 정적 함수 checkModeKanji($size, $data) { if($크기 & 1) 거짓을 반환; for($i=0; $i<$size; $i+=2) { $val = (ord($data[$i]) << 8) | ord($data[$i+1]); if( $val < 0x8140 || ($val > 0x9ffc && $val < 0xe040) || $발 > 0xebf) { 거짓을 반환; } } 사실을 반환; }/**************************************************** ******************* * 검증 ************************************************** ********************/ 공개 정적 함수 검사($mode, $size, $data) { if($size <= 0) 거짓을 반환; 스위치($mode) { 케이스 QR_MODE_NUM: return self::checkModeNum($size, $data); 부서지다; 케이스 QR_MODE_AN: return self::checkModeAn($size, $data); 부서지다; 케이스 QR_MODE_KANJI: return self::checkModeKanji($size, $data); 부서지다; 케이스 QR_MODE_8: true를 반환합니다. 부서지다; 사례 QR_MODE_STRUCTURE: true를 반환합니다. 부서지다; 기본: 부서지다; } 거짓을 반환; } //------------------------------------------------ --------- 공개 함수 estimateBitStreamSize($version) { $비트 = 0; foreach($this->항목을 $item으로) { $bits += $item->estimateBitStreamSizeOfEntry($version); } $비트를 반환합니다. } //------------------------------------------------ --------- 공개 함수 추정 버전() { $버전 = 0; $이전 = 0; 하다 { $prev = $버전; $bits = $this->estimateBitStreamSize($prev); $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); if ($version < 0) { -1을 반환합니다. } } while ($version > $prev); $버전을 반환합니다. } //------------------------------------------------ --------- 공개 정적 함수 lengthOfCode($mode, $version, $bits) { $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); 스위치($mode) { 케이스 QR_MODE_NUM: $chunks = (int)($payload / 10); $remain = $payload - $chunks * 10; $size = $chunks * 3; if($remain >= 7) { $크기 += 2; } else if($remain >= 4) { $크기 += 1; } 부서지다; 케이스 QR_MODE_AN: $chunks = (int)($payload / 11); $remain = $payload - $chunks * 11; $size = $chunks * 2; if($remain >= 6) $크기++; 부서지다; 케이스 QR_MODE_8: $size = (int)($payload / 8); 부서지다; 사례 QR_MODE_KANJI: $size = (int)(($payload / 13) * 2); 부서지다; 케이스 QR_MODE_STRUCTURE: $size = (int)($payload / 8); 부서지다; 기본: $크기 = 0; 부서지다; } $maxsize = QRspec::maximumWords($mode, $version); if($size $maxsize) $size = $maxsize; $size를 반환합니다. } //------------------------------------------------ --------- 공개 함수 createBitStream() { $to
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.