From abc520ce2a891884746a307860be898cfc16b2cb Mon Sep 17 00:00:00 2001 From: twinh Date: Sun, 20 Nov 2016 09:11:51 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=81=E7=A7=BBqrcode=E6=8F=92=E4=BB=B6=20#2?= =?UTF-8?q?028?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + .travis.yml | 35 +++++++++++ README.md | 5 ++ composer.json | 41 +++++++++++++ phpunit.xml.dist | 20 ++++++ src/Controller/Qrcode.php | 105 ++++++++++++++++++++++++++++++++ src/Plugin.php | 10 +++ tests/Controller/QrcodeTest.php | 9 +++ tests/travis.ini | 2 + 9 files changed, 230 insertions(+) create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 README.md create mode 100644 composer.json create mode 100644 phpunit.xml.dist create mode 100644 src/Controller/Qrcode.php create mode 100644 src/Plugin.php create mode 100755 tests/Controller/QrcodeTest.php create mode 100644 tests/travis.ini diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c49a5d8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +vendor/ +composer.lock +phpunit.xml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..238f842 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,35 @@ +language: php + +php: + - '5.4' + - '5.5' + - '5.6' + - '7.0' + - hhvm + - nightly + +matrix: + fast_finish: true + allow_failures: + - php: hhvm + - php: nightly + +services: + - memcached + +before_install: + - phpenv config-add tests/travis.ini + +install: + - composer install --no-interaction + +script: + - phpunit --verbose --stderr --coverage-clover build/logs/clover.xml + +after_success: + - wget https://github.com/satooshi/php-coveralls/releases/download/v1.0.1/coveralls.phar + - travis_retry php coveralls.phar -v --exclude-no-stmt + +notifications: + webhooks: + - http://build.miaoxingyun.com/travis-notifications diff --git a/README.md b/README.md new file mode 100644 index 0000000..2844516 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# 二维码 + +[![Build Status](https://img.shields.io/travis/miaoxing/qrcode/master.svg?style=flat-square)](https://travis-ci.org/miaoxing/qrcode) +[![Coverage Status](https://img.shields.io/coveralls/miaoxing/qrcode.svg?style=flat-square)](https://coveralls.io/r/miaoxing/qrcode?branch=master) +[![License](http://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square)](http://www.opensource.org/licenses/MIT) diff --git a/composer.json b/composer.json new file mode 100644 index 0000000..a0efc1d --- /dev/null +++ b/composer.json @@ -0,0 +1,41 @@ +{ + "name": "miaoxing/qrcode", + "description": "Miaoxing QR Code Plugin", + "keywords": [ + "miaoxing", "qrcode" + ], + "license": "MIT", + "require": { + "miaoxing/app": "dev-master@dev", + "t0k4rt/phpqrcode": "dev-master@dev" + }, + "autoload": { + "psr-4": { + "Miaoxing\\Qrcode\\": "src" + } + }, + "autoload-dev": { + "psr-4": { + "MiaoxingTest\\Qrcode\\": "tests" + } + }, + "minimum-stability": "dev", + "prefer-stable": true, + "repositories": [ + { + "type": "package", + "package": { + "name": "t0k4rt/phpqrcode", + "version": "dev-master", + "source": { + "url": "https://github.com/t0k4rt/phpqrcode", + "type": "git", + "reference": "origin/master" + }, + "autoload": { + "classmap": ["phpqrcode.php"] + } + } + } + ] +} diff --git a/phpunit.xml.dist b/phpunit.xml.dist new file mode 100644 index 0000000..03cf81a --- /dev/null +++ b/phpunit.xml.dist @@ -0,0 +1,20 @@ + + + + + + + tests + + + + + + src + resource + + + diff --git a/src/Controller/Qrcode.php b/src/Controller/Qrcode.php new file mode 100644 index 0000000..d952e17 --- /dev/null +++ b/src/Controller/Qrcode.php @@ -0,0 +1,105 @@ +validate([ + 'data' => $req, + 'rules' => [ + 'text' => [ + + ] + ], + 'names' => [ + 'text' => '文本内容' + ] + ]); + if (!$validator->isValid()) { + return $this->err($validator->getFirstMessage()); + } + + // 文本内容 + $text = $req['text'] ?: ''; + + // 相对大小,内容越多,图片越大 + $size = $req['size'] ?: 3; + + // 精度越高,图片越大,识别率越高,取值为0 - 4 + $level = $req['level'] ?: 3; + + $logo = $req['logo']; + + $logoSize = $req['logoSize'] ?: 30; + + // 生成二维码图片资源对象 + $enc = \QRencode::factory($level, $size, 0); + $tab = $enc->encode($text); + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab))); + $image = \QRimage::image($tab, min($size, $maxSize), 0); + + // TODO 支持远程图片 + // 将LOGO放置到图片中间 + /*if ($logo && substr($logo, 0, 4) != 'http') { + if (!file_exists($logo)) { + return $this->err('图片无效或者不存在'); + } + + $logoImg = null; + switch (strtolower(substr($logo, strrpos($logo, '.') + 1))) { + case 'jpg': + $logoImg = imagecreatefromjpeg($logo); + break; + case 'png': + $logoImg = imagecreatefrompng($logo); + break; + case 'gif': + $logoImg = imagecreatefromgif($logo); + break; + default: + return $this->err('不支持该图片类型'); + } + + $bgX = imagesx($image); + $bgY = imagesy($image); + $logoX = imagesx($logoImg); + $logoY = imagesy($logoImg); + + // 缩放logo + $tmpImg = imagecreatetruecolor($logoSize, $logoSize); + imagecopyresampled($tmpImg, $logoImg, 0, 0, 0, 0, $logoSize, $logoSize, $logoX, $logoY); + imagecopyresized($image, $tmpImg, ($bgX - $logoSize) / 2, ($bgY - $logoSize) / 2, 0, 0, $logoSize, $logoSize, $logoSize, $logoSize); + imagedestroy($logoImg); + imagedestroy($tmpImg); + }*/ + + // 生成图片内容 + ob_start(); + imagepng($image); + $content = ob_get_clean(); + imagedestroy($image); + + if (!$req['download']) { + // 展示图片 + $this->response->setHeader('Content-type', 'image/png'); + } else { + // 下载图片 + $this->response->setHeader(array( + 'Content-Description' => 'File Transfer', + 'Content-Type' => 'application/x-download', + 'Content-Disposition' => 'attachment;filename=qrcode.png', + 'Content-Transfer-Encoding' => 'binary', + 'Expires' => '0', + 'Cache-Control' => 'must-revalidate', + 'Pragma' => 'public', + 'Content-Length' => strlen($content), + )); + } + + return $content; + } +} diff --git a/src/Plugin.php b/src/Plugin.php new file mode 100644 index 0000000..624f5dc --- /dev/null +++ b/src/Plugin.php @@ -0,0 +1,10 @@ +