php有个qrcode类,一个PHP的QRcode类与大家分享

类的代码:

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);

// Levels of error correction.

define('QR_ECLEVEL_L', 0);

define('QR_ECLEVEL_M', 1);

define('QR_ECLEVEL_Q', 2);

define('QR_ECLEVEL_H', 3);

// Supported output formats

define('QR_FORMAT_TEXT', 0);

define('QR_FORMAT_PNG', 1);

class qrstr {

public static function 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));

}

}

define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there

define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true

define('QR_LOG_DIR', false); // default error logs dir

define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code

define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly

define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false

define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images

class QRtools {

public static function binarize($frame){

$len = count($frame);

foreach ($frame as &$frameLine) {

for($i=0; $i

$frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0';

}

}

return $frame;

}

public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037'){

$barcode_array = array();

if (!is_array($mode))

$mode = explode(',', $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;

}

public static function clearCache(){

self::$frames = array();

}

public static function buildCache(){

QRtools::markTime('before_build_cache');

$mask = new 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');

}

public static function log($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);

} else {

file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND);

}

}

}

}

public static function dumpMask($frame){

$width = count($frame);

for($y=0;$y

for($x=0;$x

echo ord($frame[$y][$x]).',';

}

}

}

public static function markTime($markerId){

list($usec, $sec) = explode(" ", microtime());

$time = ((float)$usec + (float)$sec);

if (!isset($GLOBALS['qr_time_bench']))

$GLOBALS['qr_time_bench'] = array();

$GLOBALS['qr_time_bench'][$markerId] = $time;

}

public static function timeBenchmark(){

self::markTime('finish');

$lastTime = 0;

$startTime = 0;

$p = 0;

echo '

BENCHMARK

';

foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) {

if ($p > 0) {

echo '

till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s';

} else {

$startTime = $thisTime;

}

$p++;

$lastTime = $thisTime;

}

echo '

TOTAL: '.number_format($lastTime-$startTime, 6).'s';

}

}

//##########################################################################

QRtools::markTime('start');

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);

class QRspec {

public static $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

);

public static function getDataLength($version, $level){

return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level];

}

public static function getECCLength($version, $level){

return self::$capacity[$version][QRCAP_EC][$level];

}

public static function getWidth($version){

return self::$capacity[$version][QRCAP_WIDTH];

}

public static function getRemainder($version){

return self::$capacity[$version][QRCAP_REMINDER];

}

public static function 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;

}

//######################################################################

public static $lengthTableBits = array(

array(10, 12, 14),

array( 9, 11, 13),

array( 8, 16, 16),

array( 8, 10, 12)

);

public static function lengthIndicator($mode, $version){

if ($mode == QR_MODE_STRUCTURE)

return 0;

if ($version <= 9) {

$l = 0;

} else if ($version <= 26) {

$l = 1;

} else {

$l = 2;

}

return self::$lengthTableBits[$mode][$l];

}

public static function maximumWords($mode, $version){

if($mode == QR_MODE_STRUCTURE)

return 3;

if($version <= 9) {

$l = 0;

} else if($version <= 26) {

$l = 1;

} else {

$l = 2;

}

$bits = self::$lengthTableBits[$mode][$l];

$words = (1 << $bits) - 1;

if($mode == QR_MODE_KANJI) {

$words *= 2; // the number of bytes is required

}

return $words;

}

public static $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

);

// CACHEABLE!!!

public static function 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;

} else {

$spec[0] = $b1;

$spec[1] = (int)($data / ($b1 + $b2));

$spec[2] = (int)($ecc / ($b1 + $b2));

$spec[3] = $b2;

$spec[4] = $spec[1] + 1;

}

}

public static $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

);

public static function putAlignmentMarker(array &$frame, $ox, $oy){

$finder = array(

"\xa1\xa1\xa1\xa1\xa1",

"\xa1\xa0\xa0\xa0\xa1",

"\xa1\xa0\xa1\xa0\xa1",

"\xa1\xa0\xa0\xa0\xa1",

"\xa1\xa1\xa1\xa1\xa1"

);

$yStart = $oy-2;

$xStart = $ox-2;

for($y=0; $y<5; $y++) {

QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]);

}

}

public static function putAlignmentPattern($version, &$frame, $width){

if($version < 2)

return;

$d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0];

if($d < 0) {

$w = 2;

} else {

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

return;

}

$cx = self::$alignmentPattern[$version][0];

for($x=1; $x

self::putAlignmentMarker($frame, 6, $cx);

self::putAlignmentMarker($frame, $cx, 6);

$cx += $d;

}

$cy = self::$alignmentPattern[$version][0];

for($y=0; $y

$cx = self::$alignmentPattern[$version][0];

for($x=0; $x

self::putAlignmentMarker($frame, $cx, $cy);

$cx += $d;

}

$cy += $d;

}

}

public static $versionPattern = array(

0x07c94, 0x085bc, 0x09a99, 0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值