新增土地列表、新增种植、种植列表、新增操作、操作列表接口
|
@ -3,8 +3,11 @@
|
||||||
namespace app\api\controller;
|
namespace app\api\controller;
|
||||||
|
|
||||||
use app\common\model\action\Action;
|
use app\common\model\action\Action;
|
||||||
use app\common\model\action\ActionPic;
|
use app\common\model\land\Land;
|
||||||
|
use app\common\model\plant\Plant;
|
||||||
|
use dh2y\qrcode\QRcode;
|
||||||
use think\facade\Db;
|
use think\facade\Db;
|
||||||
|
use think\response\Json;
|
||||||
|
|
||||||
class ActionController extends BaseApiController
|
class ActionController extends BaseApiController
|
||||||
{
|
{
|
||||||
|
@ -13,7 +16,7 @@
|
||||||
2 => ['kind','breed','dosage','start_date','end_date','area','user','pic','remark'],//除草操作字段
|
2 => ['kind','breed','dosage','start_date','end_date','area','user','pic','remark'],//除草操作字段
|
||||||
3 => ['type','start_date','end_date','area','user','pic','remark'],//灌溉操作字段
|
3 => ['type','start_date','end_date','area','user','pic','remark'],//灌溉操作字段
|
||||||
4 => ['kind','breed','dosage','start_date','end_date','area','user','pic','remark'],//除虫操作字段
|
4 => ['kind','breed','dosage','start_date','end_date','area','user','pic','remark'],//除虫操作字段
|
||||||
5 => ['area','user','pic','remark'],//收获操作字段
|
5 => ['user','pic','remark'],//收获操作字段
|
||||||
];
|
];
|
||||||
protected array $actionMessage = [
|
protected array $actionMessage = [
|
||||||
1 => '施肥操作',
|
1 => '施肥操作',
|
||||||
|
@ -24,38 +27,81 @@
|
||||||
];
|
];
|
||||||
|
|
||||||
//添加操作
|
//添加操作
|
||||||
public function add() {
|
public function add(): Json
|
||||||
$params = $this->request->post(['land_id','type','detail']);
|
{
|
||||||
if(empty($params['land_id']) || empty($params['type']) || empty($params['detail'])){
|
$params = $this->request->post(['plant_id','type','detail']);
|
||||||
|
if(empty($params['plant_id']) || empty($params['type']) || empty($params['detail'])){
|
||||||
return $this->fail('缺少必要参数');
|
return $this->fail('缺少必要参数');
|
||||||
}
|
}
|
||||||
if(!in_array($params['type'],[1,2,3,4,5,6])){
|
if(!in_array($params['type'],[1,2,3,4,5])){
|
||||||
return $this->fail('操作类型错误');
|
return $this->fail('操作类型错误');
|
||||||
}
|
}
|
||||||
$detail = json_decode($params['detail'],true);
|
$detail = json_decode($params['detail'],true);
|
||||||
if(empty($detail)){
|
if(empty($detail)){
|
||||||
return $this->fail('请填写操作格式错误');
|
return $this->fail('操作内容格式错误');
|
||||||
}
|
}
|
||||||
foreach($this->actionFields[$params['type']] as $v) {
|
foreach($this->actionFields[$params['type']] as $v) {
|
||||||
if(empty($detail[$v])){
|
if(empty($detail[$v])){
|
||||||
return $this->fail($this->actionMessage[$params['type']].'缺少必要参数');
|
return $this->fail($this->actionMessage[$params['type']].'缺少必要参数');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Db::startTrans();
|
if(!is_array($detail['pic'])){
|
||||||
try {
|
return $this->fail($this->actionMessage[$params['type']].'图片字段格式错误');
|
||||||
$actionModel = new Action();
|
|
||||||
$actionPicModel = new ActionPic();
|
|
||||||
$actionModel->save([
|
|
||||||
'land_id' => $params['land_id'],
|
|
||||||
'type' => $params['type'],
|
|
||||||
'detail' => $params['detail'],
|
|
||||||
'create_time' => time()
|
|
||||||
]);
|
|
||||||
Db::commit();
|
|
||||||
return $this->success('操作添加成功');
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
Db::rollback();
|
|
||||||
return $this->fail($e->getMessage());
|
|
||||||
}
|
}
|
||||||
|
foreach($detail as $k=>$v){
|
||||||
|
if(!in_array($k,$this->actionFields[$params['type']])){
|
||||||
|
unset($detail[$k]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$params['detail'] = json_encode($detail);
|
||||||
|
$plant = Plant::where('id',$params['plant_id'])->findOrEmpty();
|
||||||
|
if($plant->isEmpty()){
|
||||||
|
return $this->fail('土地种植信息错误');
|
||||||
|
}
|
||||||
|
if($plant['status'] == 2){
|
||||||
|
return $this->fail('当前种植信息为已收获状态,不能添加操作信息');
|
||||||
|
}
|
||||||
|
$land = Land::where('id',$plant['land_id'])->findOrEmpty();
|
||||||
|
if($land->isEmpty()){
|
||||||
|
return $this->fail('土地信息错误');
|
||||||
|
}
|
||||||
|
Db::transaction(function()use($params,$plant,$land){
|
||||||
|
Action::create([
|
||||||
|
'plant_id' => $params['plant_id'],
|
||||||
|
'type' => $params['type'],
|
||||||
|
'type_text' => $this->actionMessage[$params['type']],
|
||||||
|
'detail' => $params['detail'],
|
||||||
|
'create_time' => time(),
|
||||||
|
'update_time' => time(),
|
||||||
|
]);
|
||||||
|
if($params['type'] == 5){
|
||||||
|
$qrCode = new QRcode();
|
||||||
|
$qrCodeUrl = env('project.project_url').'/api/index/suYuan?id='.$params['plant_id'];
|
||||||
|
$qrCodeFile = $qrCode->png($qrCodeUrl,false, 6)->entry();
|
||||||
|
Plant::where('id',$params['plant_id'])->update([
|
||||||
|
'status'=>2,
|
||||||
|
'qr_code' => empty($qrCodeFile) ? '' : $qrCodeFile
|
||||||
|
]);
|
||||||
|
Land::where('id',$plant['land_id'])->update([
|
||||||
|
'residual_area'=>$land['residual_area']+$plant['area'],
|
||||||
|
'update_time' => time()
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return $this->success('操作成功');
|
||||||
|
}
|
||||||
|
|
||||||
|
//操作列表
|
||||||
|
public function list(): Json
|
||||||
|
{
|
||||||
|
$params = $this->request->get(['plant_id']);
|
||||||
|
if(empty($params['plant_id'])){
|
||||||
|
return $this->fail('缺少必要参数');
|
||||||
|
}
|
||||||
|
$data = Action::where('plant_id',$params['plant_id'])->order('create_time asc')->select()->each(function($item){
|
||||||
|
$item['detail'] = json_decode($item['detail'],true);
|
||||||
|
return $item;
|
||||||
|
})->toArray();
|
||||||
|
return $this->success('请求成功',$data);
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -30,7 +30,7 @@ class IndexController extends BaseApiController
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
public array $notNeedLogin = ['index', 'config', 'policy', 'decorate','code'];
|
public array $notNeedLogin = ['index', 'config', 'policy', 'decorate','code','suYuan'];
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -123,6 +123,10 @@ class IndexController extends BaseApiController
|
||||||
return $this->fail($e->getMessage());
|
return $this->fail($e->getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function suYuan() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -26,6 +26,21 @@
|
||||||
return $this->success('请求成功',$data);
|
return $this->success('请求成功',$data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//土地详情
|
||||||
|
public function detail(): Json
|
||||||
|
{
|
||||||
|
$params = $this->request->get(['land_id']);
|
||||||
|
if(empty($params['land_id'])){
|
||||||
|
return $this->fail('缺少必要参数');
|
||||||
|
}
|
||||||
|
$data = Land::where('id',$params['land_id'])->findOrEmpty();
|
||||||
|
if($data->isEmpty()){
|
||||||
|
return $this->fail('土地信息不存在');
|
||||||
|
}
|
||||||
|
$data['pic'] = json_decode($data['pic'],true);
|
||||||
|
return $this->success('请求成功',$data->toArray());
|
||||||
|
}
|
||||||
|
|
||||||
//添加土地
|
//添加土地
|
||||||
public function add(): Json
|
public function add(): Json
|
||||||
{
|
{
|
||||||
|
|
|
@ -9,6 +9,21 @@
|
||||||
|
|
||||||
class PlantController extends BaseApiController
|
class PlantController extends BaseApiController
|
||||||
{
|
{
|
||||||
|
//种植列表
|
||||||
|
public function list(): Json
|
||||||
|
{
|
||||||
|
$params = $this->request->get(['land_id']);
|
||||||
|
if(empty($params['land_id'])){
|
||||||
|
return $this->fail('缺少必要参数');
|
||||||
|
}
|
||||||
|
$data = Plant::where('land_id',$params['land_id'])->order('create_time desc')->select()->each(function($item){
|
||||||
|
$item['pic'] = json_decode($item['pic'],true);
|
||||||
|
$item['plant_date'] = date('Y-m-d',$item['plant_date']);
|
||||||
|
return $item;
|
||||||
|
})->toArray();
|
||||||
|
return $this->success('请求成功',$data);
|
||||||
|
}
|
||||||
|
|
||||||
//添加种植
|
//添加种植
|
||||||
public function add(): Json
|
public function add(): Json
|
||||||
{
|
{
|
||||||
|
@ -46,8 +61,10 @@
|
||||||
'status' => 1,
|
'status' => 1,
|
||||||
'create_time' => time()
|
'create_time' => time()
|
||||||
]);
|
]);
|
||||||
$residual_area = $land['residual_area']-$params['area'];
|
Land::where('id',$params['land_id'])->update([
|
||||||
Land::where('id',$params['land_id'])->update(['residual_area'=>$residual_area]);
|
'residual_area'=>$land['residual_area']-$params['area'],
|
||||||
|
'update_time' => time()
|
||||||
|
]);
|
||||||
});
|
});
|
||||||
return $this->success('种植添加成功');
|
return $this->success('种植添加成功');
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,7 +34,8 @@
|
||||||
"rmccue/requests": "^2.0",
|
"rmccue/requests": "^2.0",
|
||||||
"w7corp/easywechat": "^6.8",
|
"w7corp/easywechat": "^6.8",
|
||||||
"tencentcloud/sms": "^3.0",
|
"tencentcloud/sms": "^3.0",
|
||||||
"ext-curl": "*"
|
"ext-curl": "*",
|
||||||
|
"dh2y/think-qrcode": "^2.0"
|
||||||
},
|
},
|
||||||
"require-dev": {
|
"require-dev": {
|
||||||
"symfony/var-dumper": "^4.2",
|
"symfony/var-dumper": "^4.2",
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "bc1e827f292ccdd477dd5701ef65d783",
|
"content-hash": "ef8fb5f6b7330deffd3410dd813510fc",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "adbario/php-dot-notation",
|
"name": "adbario/php-dot-notation",
|
||||||
|
@ -267,6 +267,47 @@
|
||||||
},
|
},
|
||||||
"time": "2021-07-12T15:27:21+00:00"
|
"time": "2021-07-12T15:27:21+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "dh2y/think-qrcode",
|
||||||
|
"version": "2.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/cinaofdai/think-qrcode.git",
|
||||||
|
"reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/cinaofdai/think-qrcode/zipball/977d032afa27b1852f5fc5441fad2497f6db7ff5",
|
||||||
|
"reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"dh2y\\qrcode\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "dh2y",
|
||||||
|
"email": "xiaodai54_long@163.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "qrcode for thinkphp5",
|
||||||
|
"homepage": "https://github.com/cinaofdai/think-qrcode",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/cinaofdai/think-qrcode/issues",
|
||||||
|
"source": "https://github.com/cinaofdai/think-qrcode/tree/2.0"
|
||||||
|
},
|
||||||
|
"time": "2019-07-10T02:57:29+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "dragonmantank/cron-expression",
|
"name": "dragonmantank/cron-expression",
|
||||||
"version": "v3.3.1",
|
"version": "v3.3.1",
|
||||||
|
@ -4916,7 +4957,8 @@
|
||||||
"prefer-stable": false,
|
"prefer-stable": false,
|
||||||
"prefer-lowest": false,
|
"prefer-lowest": false,
|
||||||
"platform": {
|
"platform": {
|
||||||
"php": ">=8.0"
|
"php": ">=8.0",
|
||||||
|
"ext-curl": "*"
|
||||||
},
|
},
|
||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
"plugin-api-version": "2.3.0"
|
"plugin-api-version": "2.3.0"
|
||||||
|
|
|
@ -10,6 +10,7 @@ return array(
|
||||||
'think\\trace\\' => array($vendorDir . '/topthink/think-trace/src'),
|
'think\\trace\\' => array($vendorDir . '/topthink/think-trace/src'),
|
||||||
'think\\app\\' => array($vendorDir . '/topthink/think-multi-app/src'),
|
'think\\app\\' => array($vendorDir . '/topthink/think-multi-app/src'),
|
||||||
'think\\' => array($vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-template/src'),
|
'think\\' => array($vendorDir . '/topthink/framework/src/think', $vendorDir . '/topthink/think-helper/src', $vendorDir . '/topthink/think-orm/src', $vendorDir . '/topthink/think-template/src'),
|
||||||
|
'dh2y\\qrcode\\' => array($vendorDir . '/dh2y/think-qrcode/src'),
|
||||||
'clagiordano\\weblibs\\configmanager\\' => array($vendorDir . '/clagiordano/weblibs-configmanager/src'),
|
'clagiordano\\weblibs\\configmanager\\' => array($vendorDir . '/clagiordano/weblibs-configmanager/src'),
|
||||||
'app\\' => array($baseDir . '/app'),
|
'app\\' => array($baseDir . '/app'),
|
||||||
'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'),
|
'ZipStream\\' => array($vendorDir . '/maennchen/zipstream-php/src'),
|
||||||
|
|
|
@ -42,6 +42,10 @@ class ComposerStaticInitd2a74ba94e266cc4f45a64c54a292d7e
|
||||||
'think\\app\\' => 10,
|
'think\\app\\' => 10,
|
||||||
'think\\' => 6,
|
'think\\' => 6,
|
||||||
),
|
),
|
||||||
|
'd' =>
|
||||||
|
array (
|
||||||
|
'dh2y\\qrcode\\' => 12,
|
||||||
|
),
|
||||||
'c' =>
|
'c' =>
|
||||||
array (
|
array (
|
||||||
'clagiordano\\weblibs\\configmanager\\' => 34,
|
'clagiordano\\weblibs\\configmanager\\' => 34,
|
||||||
|
@ -166,6 +170,10 @@ class ComposerStaticInitd2a74ba94e266cc4f45a64c54a292d7e
|
||||||
2 => __DIR__ . '/..' . '/topthink/think-orm/src',
|
2 => __DIR__ . '/..' . '/topthink/think-orm/src',
|
||||||
3 => __DIR__ . '/..' . '/topthink/think-template/src',
|
3 => __DIR__ . '/..' . '/topthink/think-template/src',
|
||||||
),
|
),
|
||||||
|
'dh2y\\qrcode\\' =>
|
||||||
|
array (
|
||||||
|
0 => __DIR__ . '/..' . '/dh2y/think-qrcode/src',
|
||||||
|
),
|
||||||
'clagiordano\\weblibs\\configmanager\\' =>
|
'clagiordano\\weblibs\\configmanager\\' =>
|
||||||
array (
|
array (
|
||||||
0 => __DIR__ . '/..' . '/clagiordano/weblibs-configmanager/src',
|
0 => __DIR__ . '/..' . '/clagiordano/weblibs-configmanager/src',
|
||||||
|
|
|
@ -273,6 +273,50 @@
|
||||||
},
|
},
|
||||||
"install-path": "../clagiordano/weblibs-configmanager"
|
"install-path": "../clagiordano/weblibs-configmanager"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "dh2y/think-qrcode",
|
||||||
|
"version": "2.0",
|
||||||
|
"version_normalized": "2.0.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/cinaofdai/think-qrcode.git",
|
||||||
|
"reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/cinaofdai/think-qrcode/zipball/977d032afa27b1852f5fc5441fad2497f6db7ff5",
|
||||||
|
"reference": "977d032afa27b1852f5fc5441fad2497f6db7ff5",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"time": "2019-07-10T02:57:29+00:00",
|
||||||
|
"type": "library",
|
||||||
|
"installation-source": "dist",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"dh2y\\qrcode\\": "src/"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "dh2y",
|
||||||
|
"email": "xiaodai54_long@163.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "qrcode for thinkphp5",
|
||||||
|
"homepage": "https://github.com/cinaofdai/think-qrcode",
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/cinaofdai/think-qrcode/issues",
|
||||||
|
"source": "https://github.com/cinaofdai/think-qrcode/tree/2.0"
|
||||||
|
},
|
||||||
|
"install-path": "../dh2y/think-qrcode"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "dragonmantank/cron-expression",
|
"name": "dragonmantank/cron-expression",
|
||||||
"version": "v3.3.1",
|
"version": "v3.3.1",
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
'name' => 'topthink/think',
|
'name' => 'topthink/think',
|
||||||
'pretty_version' => 'dev-master',
|
'pretty_version' => 'dev-master',
|
||||||
'version' => 'dev-master',
|
'version' => 'dev-master',
|
||||||
'reference' => 'c119ea160bba5b4a4a66a8e378c2b112c789143a',
|
'reference' => '68951aabafc2dea38eda4ad270d23540f05b1e62',
|
||||||
'type' => 'project',
|
'type' => 'project',
|
||||||
'install_path' => __DIR__ . '/../../',
|
'install_path' => __DIR__ . '/../../',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
@ -46,6 +46,15 @@
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
'dev_requirement' => false,
|
'dev_requirement' => false,
|
||||||
),
|
),
|
||||||
|
'dh2y/think-qrcode' => array(
|
||||||
|
'pretty_version' => '2.0',
|
||||||
|
'version' => '2.0.0.0',
|
||||||
|
'reference' => '977d032afa27b1852f5fc5441fad2497f6db7ff5',
|
||||||
|
'type' => 'library',
|
||||||
|
'install_path' => __DIR__ . '/../dh2y/think-qrcode',
|
||||||
|
'aliases' => array(),
|
||||||
|
'dev_requirement' => false,
|
||||||
|
),
|
||||||
'dragonmantank/cron-expression' => array(
|
'dragonmantank/cron-expression' => array(
|
||||||
'pretty_version' => 'v3.3.1',
|
'pretty_version' => 'v3.3.1',
|
||||||
'version' => '3.3.1.0',
|
'version' => '3.3.1.0',
|
||||||
|
@ -598,7 +607,7 @@
|
||||||
'topthink/think' => array(
|
'topthink/think' => array(
|
||||||
'pretty_version' => 'dev-master',
|
'pretty_version' => 'dev-master',
|
||||||
'version' => 'dev-master',
|
'version' => 'dev-master',
|
||||||
'reference' => 'c119ea160bba5b4a4a66a8e378c2b112c789143a',
|
'reference' => '68951aabafc2dea38eda4ad270d23540f05b1e62',
|
||||||
'type' => 'project',
|
'type' => 'project',
|
||||||
'install_path' => __DIR__ . '/../../',
|
'install_path' => __DIR__ . '/../../',
|
||||||
'aliases' => array(),
|
'aliases' => array(),
|
||||||
|
|
|
@ -0,0 +1,68 @@
|
||||||
|
# think-qrcode
|
||||||
|
The ThinkPHP5 qrcode
|
||||||
|
二维码生成 SDK
|
||||||
|
## 安装
|
||||||
|
|
||||||
|
### 一、执行命令安装
|
||||||
|
```
|
||||||
|
composer require dh2y/think-qrcode
|
||||||
|
```
|
||||||
|
|
||||||
|
或者
|
||||||
|
|
||||||
|
### 二、require安装
|
||||||
|
|
||||||
|
##### thinkphp5.0 安装
|
||||||
|
```
|
||||||
|
"require": {
|
||||||
|
"dh2y/think-qrcode":"1.*"
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
##### thinkphp5.1 安装
|
||||||
|
```
|
||||||
|
"require": {
|
||||||
|
"dh2y/think-qrcode":"2.*"
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
或者
|
||||||
|
### 三、autoload psr-4标准安装
|
||||||
|
```
|
||||||
|
a) 进入vendor/dh2y目录 (没有dh2y目录 mkdir dh2y)
|
||||||
|
b) git clone
|
||||||
|
c) 修改 git clone下来的项目名称为think-qrcode
|
||||||
|
d) 添加下面配置
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"dh2y\\qrcode\\": "vendor/dh2y/think-qrcode/src"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
e) php composer.phar update
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
## 使用
|
||||||
|
#### 添加配置文件
|
||||||
|
```
|
||||||
|
return [
|
||||||
|
'cache_dir' => 'uploads'.DS.'qrcode', //缓存地址
|
||||||
|
'background'=> 'static/image/icon_cover.png' //背景图
|
||||||
|
];
|
||||||
|
```
|
||||||
|
|
||||||
|
#### 使用方法
|
||||||
|
```
|
||||||
|
$code = new QRcode();
|
||||||
|
$code_path = $code->png($register_url) //生成二维码
|
||||||
|
->logo('static/image/avatar-m.jpg') //生成logo二维码
|
||||||
|
->background(180,500) //给二维码加上背景
|
||||||
|
->text($role,20,['center',740],'#ff4351') //添加文字水印
|
||||||
|
->text($nick_name,20,['center',780],'#000000')
|
||||||
|
->getPath(); //获取二维码生成的地址
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,25 @@
|
||||||
|
{
|
||||||
|
"name": "dh2y/think-qrcode",
|
||||||
|
"description": "qrcode for thinkphp5",
|
||||||
|
"homepage": "https://github.com/cinaofdai/think-qrcode",
|
||||||
|
"license": "MIT",
|
||||||
|
"minimum-stability": "stable",
|
||||||
|
"version": "2.0",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "dh2y",
|
||||||
|
"email": "xiaodai54_long@163.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"issues": "https://github.com/cinaofdai/think-qrcode/issues"
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=5.4.0"
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"dh2y\\qrcode\\": "src/"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,227 @@
|
||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Created by dh2y.
|
||||||
|
* Date: 2018/8/8 14:38
|
||||||
|
* for: 二维码生成
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace dh2y\qrcode;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
use think\Exception;
|
||||||
|
use think\facade\Config;
|
||||||
|
use think\facade\Request;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
class QRcode
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
protected $config = []; //相关配置
|
||||||
|
protected $cache_dir = ''; //二维码缓存
|
||||||
|
protected $outfile = ''; //输出二维码文件
|
||||||
|
|
||||||
|
protected $error = ''; //错误信息
|
||||||
|
|
||||||
|
public function __construct(){
|
||||||
|
|
||||||
|
$this->config= Config::get('qrcode.');
|
||||||
|
|
||||||
|
if(isset($this->config['cache_dir'])&&$this->config['cache_dir']!=''){
|
||||||
|
$this->cache_dir = $this->config['cache_dir'];
|
||||||
|
}else{
|
||||||
|
$this->cache_dir = 'uploads/qrcode';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if (!file_exists($this->cache_dir)){
|
||||||
|
mkdir ($this->cache_dir,0775,true);
|
||||||
|
}
|
||||||
|
|
||||||
|
require("phpqrcode/qrlib.php");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 生成普通二维码
|
||||||
|
* @param string $url 生成url地址
|
||||||
|
* @param bool $outfile
|
||||||
|
* @param int $size
|
||||||
|
* @param string $evel
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function png($url,$outfile=false,$size=5,$evel='H'){
|
||||||
|
|
||||||
|
if(!$outfile){
|
||||||
|
$outfile = $this->cache_dir.'/'.time().'.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->outfile = $outfile;
|
||||||
|
|
||||||
|
\QRcode::png($url,$outfile,$evel,$size,2);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 显示二维码
|
||||||
|
*/
|
||||||
|
public function show(){
|
||||||
|
$url = Request::instance()->domain().'/'.$this->outfile;
|
||||||
|
exit('<img src="'.$url.'"/>');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回url路径
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function entry(){
|
||||||
|
return Request::instance()->domain().'/'.$this->outfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 返回生成二维码的相对路径
|
||||||
|
* @param bool $ds
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function getPath($ds=true){
|
||||||
|
if($ds){
|
||||||
|
return '/'.$this->outfile;
|
||||||
|
}else{
|
||||||
|
return $this->outfile;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 销毁内容
|
||||||
|
*/
|
||||||
|
public function destroy(){
|
||||||
|
@unlink($this->outfile);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加logo到二维码中
|
||||||
|
* @param $logo
|
||||||
|
* @return bool|mixed
|
||||||
|
*/
|
||||||
|
public function logo($logo){
|
||||||
|
if (!isset($logo)||$logo=='') {
|
||||||
|
$this->error = 'logo不存在';
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
$QR = imagecreatefromstring(file_get_contents($this->outfile));
|
||||||
|
$logo = imagecreatefromstring(file_get_contents($logo));
|
||||||
|
$QR_width = imagesx($QR);//二维码图片宽度
|
||||||
|
$QR_height = imagesy($QR);//二维码图片高度
|
||||||
|
$logo_width = imagesx($logo);//logo图片宽度
|
||||||
|
$logo_height = imagesy($logo);//logo图片高度
|
||||||
|
$logo_qr_width = $QR_width / 5;
|
||||||
|
$scale = $logo_width/$logo_qr_width;
|
||||||
|
$logo_qr_height = $logo_height/$scale;
|
||||||
|
$from_width = ($QR_width - $logo_qr_width) / 2;
|
||||||
|
//重新组合图片并调整大小
|
||||||
|
imagecopyresampled($QR, $logo, $from_width, $from_width, 0, 0, $logo_qr_width, $logo_qr_height, $logo_width, $logo_height);
|
||||||
|
|
||||||
|
$this->outfile = $this->cache_dir.'/'.time().'.png';
|
||||||
|
imagepng($QR, $this->outfile);
|
||||||
|
imagedestroy($QR);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加背景图
|
||||||
|
* @param int $x 二维码在背景图X轴未知
|
||||||
|
* @param int $y 二维码在背景图Y轴未知
|
||||||
|
* @param string $dst_path
|
||||||
|
* @return $this
|
||||||
|
*/
|
||||||
|
public function background($x=200,$y=500,$dst_path = ''){
|
||||||
|
|
||||||
|
if($dst_path==''){
|
||||||
|
$dst_path = $this->config['background'];
|
||||||
|
}
|
||||||
|
$src_path = $this->outfile;//覆盖图
|
||||||
|
|
||||||
|
//创建图片的实例
|
||||||
|
$dst = imagecreatefromstring(file_get_contents($dst_path));
|
||||||
|
$src = imagecreatefromstring(file_get_contents($src_path));
|
||||||
|
|
||||||
|
//获取覆盖图图片的宽高
|
||||||
|
list($src_w, $src_h) = getimagesize($src_path);
|
||||||
|
|
||||||
|
//将覆盖图复制到目标图片上,最后个参数100是设置透明度(100是不透明),这里实现不透明效果
|
||||||
|
imagecopymerge($dst, $src, $x, $y, 0, 0, $src_w, $src_h, 100);
|
||||||
|
|
||||||
|
$this->outfile = $this->cache_dir.'/'.time().'.png';
|
||||||
|
imagepng($dst, $this->outfile);//根据需要生成相应的图片
|
||||||
|
imagedestroy($dst);
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function text($text,$size,$locate =[],$color = '#00000000',$font='simsun.ttc', $offset = 0, $angle = 0) {
|
||||||
|
|
||||||
|
$dst_path = $this->outfile;
|
||||||
|
|
||||||
|
//创建图片的实例
|
||||||
|
$dst = imagecreatefromstring(file_get_contents($dst_path));
|
||||||
|
|
||||||
|
/* 设置颜色 */
|
||||||
|
if (is_string($color) && 0 === strpos($color, '#')) {
|
||||||
|
$color = str_split(substr($color, 1), 2);
|
||||||
|
$color = array_map('hexdec', $color);
|
||||||
|
if (empty($color[3]) || $color[3] > 127) {
|
||||||
|
$color[3] = 0;
|
||||||
|
}
|
||||||
|
} elseif (!is_array($color)) {
|
||||||
|
throw new Exception('错误的颜色值');
|
||||||
|
}
|
||||||
|
|
||||||
|
//如果字体不存在 用composer项目自己的字体
|
||||||
|
if(!is_file($font)){
|
||||||
|
$font = dirname(__FILE__).'/'.$font;
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取文字信息
|
||||||
|
$info = imagettfbbox($size, $angle, $font, $text);
|
||||||
|
$minx = min($info[0], $info[2], $info[4], $info[6]);
|
||||||
|
$maxx = max($info[0], $info[2], $info[4], $info[6]);
|
||||||
|
$miny = min($info[1], $info[3], $info[5], $info[7]);
|
||||||
|
$maxy = max($info[1], $info[3], $info[5], $info[7]);
|
||||||
|
/* 计算文字初始坐标和尺寸 */
|
||||||
|
$x = $minx;
|
||||||
|
$y = abs($miny);
|
||||||
|
$w = $maxx - $minx;
|
||||||
|
$h = $maxy - $miny;
|
||||||
|
|
||||||
|
//背景图信息
|
||||||
|
list($dst_w, $dst_h) = getimagesize($dst_path);
|
||||||
|
|
||||||
|
if (is_array($locate)) {
|
||||||
|
list($posx, $posy) = $locate;
|
||||||
|
$x += ($posx=='center')?(($dst_w - $w) / 2):$posx;
|
||||||
|
$y += ($posy=='center')?(($dst_h - $h) / 2):$posy;
|
||||||
|
} else {
|
||||||
|
throw new Exception('不支持的文字位置类型');
|
||||||
|
}
|
||||||
|
|
||||||
|
//字体颜色
|
||||||
|
$black = imagecolorallocate($dst, $color[0], $color[1], $color[2]);
|
||||||
|
|
||||||
|
//加入文字
|
||||||
|
imagefttext($dst, $size, $angle, $x, $y, $black,$font, $text);
|
||||||
|
|
||||||
|
|
||||||
|
//生成图片
|
||||||
|
$this->outfile = $this->cache_dir.'/'.time().'.png';
|
||||||
|
imagepng($dst, $this->outfile);
|
||||||
|
imagedestroy($dst);
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1 @@
|
||||||
|
2018-08-08 15:16:58: imagepng(/data/wwwroot/web/www.shiyongxiu.com/runtime/QRcode_cache/1533712618.png): failed to open stream: No such file or directory
|
|
@ -0,0 +1 @@
|
||||||
|
2018-08-08 15:17:01: imagepng(/data/wwwroot/web/www.shiyongxiu.com/runtime/QRcode_cache/1533712621.png): failed to open stream: No such file or directory
|
|
@ -0,0 +1,38 @@
|
||||||
|
* 1.0.0 build 2010031920
|
||||||
|
|
||||||
|
- first public release
|
||||||
|
- help in readme, install
|
||||||
|
- cleanup ans separation of QRtools and QRspec
|
||||||
|
- now TCPDF binding requires minimal changes in TCPDF, having most of job
|
||||||
|
done in QRtools tcpdfBarcodeArray
|
||||||
|
- nicer QRtools::timeBenchmark output
|
||||||
|
- license and copyright notices in files
|
||||||
|
- indent cleanup - from tab to 4spc, keep it that way please :)
|
||||||
|
- sf project, repository, wiki
|
||||||
|
- simple code generator in index.php
|
||||||
|
|
||||||
|
* 1.1.0 build 2010032113
|
||||||
|
|
||||||
|
- added merge tool wich generate merged version of code
|
||||||
|
located in phpqrcode.php
|
||||||
|
- splited qrconst.php from qrlib.php
|
||||||
|
|
||||||
|
* 1.1.1 build 2010032405
|
||||||
|
|
||||||
|
- patch by Rick Seymour allowing saving PNG and displaying it at the same time
|
||||||
|
- added version info in VERSION file
|
||||||
|
- modified merge tool to include version info into generated file
|
||||||
|
- fixed e-mail in almost all head comments
|
||||||
|
|
||||||
|
* 1.1.2 build 2010032722
|
||||||
|
|
||||||
|
- full integration with TCPDF thanks to Nicola Asuni, it's author
|
||||||
|
- fixed bug with alphanumeric encoding detection
|
||||||
|
|
||||||
|
* 1.1.3 build 2010081807
|
||||||
|
|
||||||
|
- short opening tags replaced with standard ones
|
||||||
|
|
||||||
|
* 1.1.4 build 2010100721
|
||||||
|
|
||||||
|
- added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC)
|
|
@ -0,0 +1,67 @@
|
||||||
|
== REQUIREMENTS ==
|
||||||
|
|
||||||
|
* PHP5
|
||||||
|
* PHP GD2 extension with JPEG and PNG support
|
||||||
|
|
||||||
|
== INSTALLATION ==
|
||||||
|
|
||||||
|
If you want to recreate cache by yourself make sure cache directory is
|
||||||
|
writable and you have permisions to write into it. Also make sure you are
|
||||||
|
able to read files in it if you have cache option enabled
|
||||||
|
|
||||||
|
== CONFIGURATION ==
|
||||||
|
|
||||||
|
Feel free to modify config constants in qrconfig.php file. Read about it in
|
||||||
|
provided comments and project wiki page (links in README file)
|
||||||
|
|
||||||
|
== QUICK START ==
|
||||||
|
|
||||||
|
Notice: probably you should'nt use all of this in same script :)
|
||||||
|
|
||||||
|
<?phpb
|
||||||
|
|
||||||
|
//include only that one, rest required files will be included from it
|
||||||
|
include "qrlib.php"
|
||||||
|
|
||||||
|
//write code into file, Error corection lecer is lowest, L (one form: L,M,Q,H)
|
||||||
|
//each code square will be 4x4 pixels (4x zoom)
|
||||||
|
//code will have 2 code squares white boundary around
|
||||||
|
|
||||||
|
QRcode::png('PHP QR Code :)', 'test.png', 'L', 4, 2);
|
||||||
|
|
||||||
|
//same as above but outputs file directly into browser (with appr. header etc.)
|
||||||
|
//all other settings are default
|
||||||
|
//WARNING! it should be FIRST and ONLY output generated by script, otherwise
|
||||||
|
//rest of output will land inside PNG binary, breaking it for sure
|
||||||
|
QRcode::png('PHP QR Code :)');
|
||||||
|
|
||||||
|
//show benchmark
|
||||||
|
QRtools::timeBenchmark();
|
||||||
|
|
||||||
|
//rebuild cache
|
||||||
|
QRtools::buildCache();
|
||||||
|
|
||||||
|
//code generated in text mode - as a binary table
|
||||||
|
//then displayed out as HTML using Unicode block building chars :)
|
||||||
|
$tab = $qr->encode('PHP QR Code :)');
|
||||||
|
QRspec::debug($tab, true);
|
||||||
|
|
||||||
|
== TCPDF INTEGRATION ==
|
||||||
|
|
||||||
|
Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php.
|
||||||
|
Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge)
|
||||||
|
2dbarcodes.php
|
||||||
|
|
||||||
|
Then use similar as example #50 from TCPDF examples:
|
||||||
|
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$style = array(
|
||||||
|
'border' => true,
|
||||||
|
'padding' => 4,
|
||||||
|
'fgcolor' => array(0,0,0),
|
||||||
|
'bgcolor' => false, //array(255,255,255)
|
||||||
|
);
|
||||||
|
|
||||||
|
//code name: QR, specify error correction level after semicolon (L,M,Q,H)
|
||||||
|
$pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N');
|
|
@ -0,0 +1,165 @@
|
||||||
|
GNU LESSER GENERAL PUBLIC LICENSE
|
||||||
|
Version 3, 29 June 2007
|
||||||
|
|
||||||
|
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||||
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
|
|
||||||
|
This version of the GNU Lesser General Public License incorporates
|
||||||
|
the terms and conditions of version 3 of the GNU General Public
|
||||||
|
License, supplemented by the additional permissions listed below.
|
||||||
|
|
||||||
|
0. Additional Definitions.
|
||||||
|
|
||||||
|
As used herein, "this License" refers to version 3 of the GNU Lesser
|
||||||
|
General Public License, and the "GNU GPL" refers to version 3 of the GNU
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
"The Library" refers to a covered work governed by this License,
|
||||||
|
other than an Application or a Combined Work as defined below.
|
||||||
|
|
||||||
|
An "Application" is any work that makes use of an interface provided
|
||||||
|
by the Library, but which is not otherwise based on the Library.
|
||||||
|
Defining a subclass of a class defined by the Library is deemed a mode
|
||||||
|
of using an interface provided by the Library.
|
||||||
|
|
||||||
|
A "Combined Work" is a work produced by combining or linking an
|
||||||
|
Application with the Library. The particular version of the Library
|
||||||
|
with which the Combined Work was made is also called the "Linked
|
||||||
|
Version".
|
||||||
|
|
||||||
|
The "Minimal Corresponding Source" for a Combined Work means the
|
||||||
|
Corresponding Source for the Combined Work, excluding any source code
|
||||||
|
for portions of the Combined Work that, considered in isolation, are
|
||||||
|
based on the Application, and not on the Linked Version.
|
||||||
|
|
||||||
|
The "Corresponding Application Code" for a Combined Work means the
|
||||||
|
object code and/or source code for the Application, including any data
|
||||||
|
and utility programs needed for reproducing the Combined Work from the
|
||||||
|
Application, but excluding the System Libraries of the Combined Work.
|
||||||
|
|
||||||
|
1. Exception to Section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
You may convey a covered work under sections 3 and 4 of this License
|
||||||
|
without being bound by section 3 of the GNU GPL.
|
||||||
|
|
||||||
|
2. Conveying Modified Versions.
|
||||||
|
|
||||||
|
If you modify a copy of the Library, and, in your modifications, a
|
||||||
|
facility refers to a function or data to be supplied by an Application
|
||||||
|
that uses the facility (other than as an argument passed when the
|
||||||
|
facility is invoked), then you may convey a copy of the modified
|
||||||
|
version:
|
||||||
|
|
||||||
|
a) under this License, provided that you make a good faith effort to
|
||||||
|
ensure that, in the event an Application does not supply the
|
||||||
|
function or data, the facility still operates, and performs
|
||||||
|
whatever part of its purpose remains meaningful, or
|
||||||
|
|
||||||
|
b) under the GNU GPL, with none of the additional permissions of
|
||||||
|
this License applicable to that copy.
|
||||||
|
|
||||||
|
3. Object Code Incorporating Material from Library Header Files.
|
||||||
|
|
||||||
|
The object code form of an Application may incorporate material from
|
||||||
|
a header file that is part of the Library. You may convey such object
|
||||||
|
code under terms of your choice, provided that, if the incorporated
|
||||||
|
material is not limited to numerical parameters, data structure
|
||||||
|
layouts and accessors, or small macros, inline functions and templates
|
||||||
|
(ten or fewer lines in length), you do both of the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the object code that the
|
||||||
|
Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the object code with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
4. Combined Works.
|
||||||
|
|
||||||
|
You may convey a Combined Work under terms of your choice that,
|
||||||
|
taken together, effectively do not restrict modification of the
|
||||||
|
portions of the Library contained in the Combined Work and reverse
|
||||||
|
engineering for debugging such modifications, if you also do each of
|
||||||
|
the following:
|
||||||
|
|
||||||
|
a) Give prominent notice with each copy of the Combined Work that
|
||||||
|
the Library is used in it and that the Library and its use are
|
||||||
|
covered by this License.
|
||||||
|
|
||||||
|
b) Accompany the Combined Work with a copy of the GNU GPL and this license
|
||||||
|
document.
|
||||||
|
|
||||||
|
c) For a Combined Work that displays copyright notices during
|
||||||
|
execution, include the copyright notice for the Library among
|
||||||
|
these notices, as well as a reference directing the user to the
|
||||||
|
copies of the GNU GPL and this license document.
|
||||||
|
|
||||||
|
d) Do one of the following:
|
||||||
|
|
||||||
|
0) Convey the Minimal Corresponding Source under the terms of this
|
||||||
|
License, and the Corresponding Application Code in a form
|
||||||
|
suitable for, and under terms that permit, the user to
|
||||||
|
recombine or relink the Application with a modified version of
|
||||||
|
the Linked Version to produce a modified Combined Work, in the
|
||||||
|
manner specified by section 6 of the GNU GPL for conveying
|
||||||
|
Corresponding Source.
|
||||||
|
|
||||||
|
1) Use a suitable shared library mechanism for linking with the
|
||||||
|
Library. A suitable mechanism is one that (a) uses at run time
|
||||||
|
a copy of the Library already present on the user's computer
|
||||||
|
system, and (b) will operate properly with a modified version
|
||||||
|
of the Library that is interface-compatible with the Linked
|
||||||
|
Version.
|
||||||
|
|
||||||
|
e) Provide Installation Information, but only if you would otherwise
|
||||||
|
be required to provide such information under section 6 of the
|
||||||
|
GNU GPL, and only to the extent that such information is
|
||||||
|
necessary to install and execute a modified version of the
|
||||||
|
Combined Work produced by recombining or relinking the
|
||||||
|
Application with a modified version of the Linked Version. (If
|
||||||
|
you use option 4d0, the Installation Information must accompany
|
||||||
|
the Minimal Corresponding Source and Corresponding Application
|
||||||
|
Code. If you use option 4d1, you must provide the Installation
|
||||||
|
Information in the manner specified by section 6 of the GNU GPL
|
||||||
|
for conveying Corresponding Source.)
|
||||||
|
|
||||||
|
5. Combined Libraries.
|
||||||
|
|
||||||
|
You may place library facilities that are a work based on the
|
||||||
|
Library side by side in a single library together with other library
|
||||||
|
facilities that are not Applications and are not covered by this
|
||||||
|
License, and convey such a combined library under terms of your
|
||||||
|
choice, if you do both of the following:
|
||||||
|
|
||||||
|
a) Accompany the combined library with a copy of the same work based
|
||||||
|
on the Library, uncombined with any other library facilities,
|
||||||
|
conveyed under the terms of this License.
|
||||||
|
|
||||||
|
b) Give prominent notice with the combined library that part of it
|
||||||
|
is a work based on the Library, and explaining where to find the
|
||||||
|
accompanying uncombined form of the same work.
|
||||||
|
|
||||||
|
6. Revised Versions of the GNU Lesser General Public License.
|
||||||
|
|
||||||
|
The Free Software Foundation may publish revised and/or new versions
|
||||||
|
of the GNU Lesser General Public License from time to time. Such new
|
||||||
|
versions will be similar in spirit to the present version, but may
|
||||||
|
differ in detail to address new problems or concerns.
|
||||||
|
|
||||||
|
Each version is given a distinguishing version number. If the
|
||||||
|
Library as you received it specifies that a certain numbered version
|
||||||
|
of the GNU Lesser General Public License "or any later version"
|
||||||
|
applies to it, you have the option of following the terms and
|
||||||
|
conditions either of that published version or of any later version
|
||||||
|
published by the Free Software Foundation. If the Library as you
|
||||||
|
received it does not specify a version number of the GNU Lesser
|
||||||
|
General Public License, you may choose any version of the GNU Lesser
|
||||||
|
General Public License ever published by the Free Software Foundation.
|
||||||
|
|
||||||
|
If the Library as you received it specifies that a proxy can decide
|
||||||
|
whether future versions of the GNU Lesser General Public License shall
|
||||||
|
apply, that proxy's public statement of acceptance of any version is
|
||||||
|
permanent authorization for you to choose that version for the
|
||||||
|
Library.
|
|
@ -0,0 +1,45 @@
|
||||||
|
This is PHP implementation of QR Code 2-D barcode generator. It is pure-php
|
||||||
|
LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi.
|
||||||
|
|
||||||
|
== LICENSING ==
|
||||||
|
|
||||||
|
Copyright (C) 2010 by Dominik Dzienia
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or modify it under
|
||||||
|
the terms of the GNU Lesser General Public License as published by the Free
|
||||||
|
Software Foundation; either version 3 of the License, or any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||||
|
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||||
|
PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file)
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Lesser General Public License along
|
||||||
|
with this library; if not, write to the Free Software Foundation, Inc., 51
|
||||||
|
Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
== INSTALATION AND USAGE ==
|
||||||
|
|
||||||
|
* INSTALL file
|
||||||
|
* http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page
|
||||||
|
|
||||||
|
== CONTACT ==
|
||||||
|
|
||||||
|
Fell free to contact me via e-mail (deltalab at poczta dot fm) or using
|
||||||
|
folowing project pages:
|
||||||
|
|
||||||
|
* http://sourceforge.net/projects/phpqrcode/
|
||||||
|
* http://phpqrcode.sourceforge.net/
|
||||||
|
|
||||||
|
== ACKNOWLEDGMENTS ==
|
||||||
|
|
||||||
|
Based on C libqrencode library (ver. 3.1.1)
|
||||||
|
Copyright (C) 2006-2010 by Kentaro Fukuchi
|
||||||
|
http://megaui.net/fukuchi/works/qrencode/index.en.html
|
||||||
|
|
||||||
|
QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other
|
||||||
|
countries.
|
||||||
|
|
||||||
|
Reed-Solomon code encoder is written by Phil Karn, KA9Q.
|
||||||
|
Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
1.1.4
|
||||||
|
2010100721
|
|
@ -0,0 +1,2 @@
|
||||||
|
xÚ<EFBFBD><EFBFBD>Á
À E9³u<06><>`³"PÅ„CÛ牗T!0$
|
||||||
|
E•É²Q™<EFBFBD>Ém½úhÛ¾9{kI"› 9Ln)Ap¤åÖ¾Ë>ß^‡Õz³mënÅ–;ü´mßn†ú¦Ë
|
After Width: | Height: | Size: 126 B |
After Width: | Height: | Size: 202 B |
After Width: | Height: | Size: 205 B |
After Width: | Height: | Size: 216 B |
After Width: | Height: | Size: 210 B |
After Width: | Height: | Size: 213 B |
After Width: | Height: | Size: 219 B |
|
@ -0,0 +1 @@
|
||||||
|
xÚí™A„ E]sëIX´;¸Ün6€È`‚q”êêW6ñ奚`Œ%A/3!¢°‚¢Š!g–ÈÌ¡’1N)éE¢Ï|;®—>6â¸<C3A2>Þ97$ëÄôëc]kkö<6B>wé1Öü[·mCÍœcÊRºÄê¹>¦èµ¾šE,•hʼnp„#áxF<1C>yWÏÇVWGçòÕ3¼Õ+шþàË“úSŽâ}Äž<C384>#áG8b^c^cÏÀŽp„c&3YQ"ñŽ÷çÌvµù›…ñàÎþþ¼–¹kÞ9ŠÜ‡÷}”¹³ï×ú ¢Ä¿<C384>QäÿL—/ÝÔÀÏ
|
After Width: | Height: | Size: 211 B |
After Width: | Height: | Size: 211 B |
|
@ -0,0 +1,2 @@
|
||||||
|
xÚí™A
|
||||||
|
ƒ0E]çÖ…,2;sƒä&ÉÍšh¥ÛêO¡ôÝÈàã1&09OIv@DDÒÌ&§Ù‰K<E280B0>XÈÕFv•<Ádqò9Ö<%h•¹Yïs!(d¥²ës;~||b(ÏøYůg#µ`œK ±S¼Åô¹Ä¶˜ùsàidß<64>Lg:Ó™Îtþ/gmª<6D>™ƒkÅMâ3³{4rTÈQýÿe¥·s·>ó<Ó™Ît¦3<C2A6>éÌ;ïH¼#Ñ™Ît¦3<C2A6>ÍYœ+og©hù¶óµÙ½¬lnðûF>Øi^»#awm;gè~pÛgìNs{6z’‘»ãºïÞäp¾Ê'
|
After Width: | Height: | Size: 228 B |
|
@ -0,0 +1,3 @@
|
||||||
|
xÚíšA
|
||||||
|
Ä E»öÖ.ĚNo 7Ń›Ť¶iiRÚN2‹áW%đxÁ@ÚÚśę'
|
||||||
|
u<EFBFBD>6×ę<EFBFBD>.ť*S;}<7D>«ŇĂ ĎTúčĚzrŤtąď%ç,ŇĹÚâÎ}ç;“âç)ąź<C485>âÝZÚîLĺčą÷¬Pçç$Ż×÷ĎqËgśLÂôdJ‡;Üáw¸Ăý.]z#źľ«[Íť˝ďOg‚Ćô"ĐË áBíî¦}Ç}‡;Üáw¸Ăî<>#1GbŽ„;Üáw¸Ăý_ÝC+w˘@Dfî÷ďç™uťř2™ĹÚÉNţű9R7|pWßkďű®ż“ßßkşöżşú»ĽÎÓ
|
After Width: | Height: | Size: 225 B |
|
@ -0,0 +1 @@
|
||||||
|
xÚÍ’Í
À F{vë& à&°Y+?Z1öÐSŸ'y!¢ŸÌÁa<C381>815&£•Û´ŽÙHå£Ùžc³•l«ÏFÆè1º#é6fÊÖü©§6Äø•O7ˆ¨†C¦«›ðÖ<C3B0>ž<EFBFBD>Ï8gI®ÏöfB¦ÃÄÿæ\DÔ»(
|
After Width: | Height: | Size: 144 B |
After Width: | Height: | Size: 225 B |
|
@ -0,0 +1 @@
|
||||||
|
xÚíšA„ E]sëIX´;¹Ün6Up‚<13>“в™ÿ]Ù˜þ<i-eWö‹¶˜)×äÅ•¼ÉÂ…H\jvqÙHL\6–šÝÐ…rI›¢LܹÜÕ%ÅÓ@´þ±V—vÆÂúý¤(ÏP4|ÎXnÒgÉ<>ß¼~]D¾ÉÕ×u1Us S\À°€,ÿÅ2Þ¢N§Ã?D›KºüF-:“eJ]p_À°€,˜a0Ã`†ÁÝXÀ°`†Áƒw,`X´]˜ˆ™‚¹‹˜°5‰®Y4{å±æñ2íûåvçJs†±Ûí9±˜í)õu±Û¹êÏØ,«]¸“‹Ù^_§7$ƒ_Í
|
After Width: | Height: | Size: 235 B |
|
@ -0,0 +1,3 @@
|
||||||
|
xÚíšA
|
||||||
|
„0E]{ë<>.’]{{{³©Z¥BepÆÞwe@<1F>V›ERZ3»Á"*2o€4¦y‰)i#dÒbdFÒ…´ŒI"ú‘—4ž½WIíuŠÓ45ßx«.ZSÙ{ÁŸ¯8åËÿk={o.±qÊÙ£[œÍ:帒q»õƒy
|
||||||
|
)t#á„N8ádCj<43>-O<>OG}¼:/Ÿ:s<>z!Å)^<ùe½·S·uâ{ 'œp 'ú=ú=ú=¾'œp 'œp¢ß£ß£ßã<1F>N8á„Óÿ9©ªˆôpQQõ]HÔpz¾<7A>ØGœ^æ½Qº˜I|¾ß³<C39F>u;9™ÎïÕëd;“X~$ËÙÑÉt¶ÊÛédy
|
After Width: | Height: | Size: 226 B |
|
@ -0,0 +1,3 @@
|
||||||
|
xÚíšA
|
||||||
|
à E³öÖfo 7Ñ›U<E280BA>) %M!ΔÂûYu(<šð“sK²“Tœ›Ó
|
||||||
|
É&§IÚ\i+¥Ðª™(m®´FQ¡¹¯h±æöüèv~n1„oÏ]sëçÖï¤_ÞŸÊ3`î_w2õȹ•lc[¼•;·Ûc֟ˤ’Nóª4ÜpÃ
7ÜpÃímTÿ¸œ›‘ÝêrÞiñä_ƒç¿pS=7Þ7ÜpÃ
7ÜpÃ<70>>IŸ¤Oò-Á
7ÜpÃ
7ú$}’>É·7ÜpÃ
·tss‰Órs
§åVÍÎÜÆ÷’mýï¡Ò¹ò‡<C3B2>Þñ}R~7ôà&¾÷º?7ù<37>Þý<C39E>Ô¦Iïbhâ{æ»<ÀMi-
|
After Width: | Height: | Size: 220 B |
|
@ -0,0 +1 @@
|
||||||
|
xΪν›Aƒ E»φΦMX0;Έ<>άnVP4ΪHSS»xίU3±/O΄ύLiJ4<4A><34>±VβJC<4A>%ύ‰6VR&ΓήD‘B<E28098>HjDω‚JΟ??™―κBlcΗ±ρ½§'σUλXοUοή<CEBF>0ζΓywΝΔ―χj¬ιλ<CEB9>³€3Ε›Ύλ<CE8E>cj†ω£{¨¥½:GqΔG<1C>έρψ<CF81>ϋΪ°N†v;Ή¶η¬“J‡ΔΠ<ϋ‡Ι]<5D>κλΘσ<CE98>#<23>8β<38>#<23>8βH'§“ΣΙωΝΑGqΔGιδtr:9Ο#<23>8β<38>#<23>8βΨ“h<68>―NΤt”<74>΄Φ_έΨ>tΉeλμS―¦ζ<C2A6>ω^<5E>\g―υΞQe?ωvuφΜoοΥ;<3B>ο>μ<>*οwlςΧmΡ
|
After Width: | Height: | Size: 242 B |
|
@ -0,0 +1,3 @@
|
||||||
|
xÚíÛA
|
||||||
|
à …á¬së‚‹™]rƒx½Y51mMÈBG
|
||||||
|
ÿ¸*Sx|Ua5Ƶ‚Z—Š„-,Ž1ä²HÑPÒRj–šX5§®i†©’áG©>W¥ŽžRïöÕ/Ëâ+uT廯åÏӯ嗴ªuæÏ¥Ú[Sía£[kví÷5•+5n§Á´JêÜ%+V¬X±bÅŠõ߬u'Á<07>±þÔû SRýå÷štzZ»ì+÷+V¬X±bÅŠ•ÙŸÙŸÙŸûŠ+V¬X±bÅÊìÏìÏìÏ}ÅŠ+V¬X±ö±ª¤¥ÖVI©¢ÖÖ‘+k«qÿ[úËtŽ·oVZÍþvoNV³wÇ}µ{³r<ýRÞ"<22>RÍÞ]ê
W«r}
|
After Width: | Height: | Size: 242 B |
|
@ -0,0 +1,2 @@
|
||||||
|
xÚí›A
|
||||||
|
à E³öÖ…,t§7ˆ7Ñ›U<E280BA> E)i7ï»*~cÃüÅÄXÖEBÆè°FC–˜³6¡:&çL,å¬Mv.ŽÂÎæKgŸÕ¸ãYMç>ŸÎí>ûmÛš·?ª•vô¹¾mg?<3F>ßÒ±Îþ³æηªd˜“Cµ¹U¦ÏIk•ÚÚE\ÕÙMs†f˜a†f˜a>œ[sÓˆ9쬩ެ8bö<kÕÙ7œ}ç†k³™§õ™ÿ3Ì0Ã3Ì0Ã3Ìä*r¹Š\Å7f˜a†f˜a†fr¹Š\Å7f˜a†f˜a†YÆÙ<18>Îæd›4ƒ9kíÆÌÔÝyûX y‰gŒØÙ)›«dw<64>nÌ¢ûU×>Ëî”]ßöLgÉÝÁ›³è¾äEo‚ w1
|
After Width: | Height: | Size: 244 B |
After Width: | Height: | Size: 237 B |
After Width: | Height: | Size: 234 B |
|
@ -0,0 +1,2 @@
|
||||||
|
xÚíÜA<0E> …a×Ţş ‹™ťÜ@n7+*¶šÖÚ4‘!Í?®Jšđň ł<>”抮«]Ş—ÉSźâTf)–ŮsŠIÂ"…Č”bžÝ0…Š|•"Luٸî,Ž×EÇ1\6®*ĎuQŢ?Ľ>aĚĎ…ăţńŽÄRő-r“÷n.ďꯋ\®Tżü:Ó*)|)°Ŕ,°Ŕ,ţŃâęóĺéx_ă¬}:^R„<52>Uoɢ‰uÁ~ÁމX`<60>XĐŹĐŹĐŹĐŹ°_`<60>X`<60>XĐŹĐŹĐŹ°_`<60>X`<60>XĐŹĐŹĐŹĐŹ°wb<77>X`<60>żĄPUőö)DÔŢ"cČ{‹zçÎő3ę›é<}¸óˇ^?b÷m˙ÎÂěž<C49B>íş°»óaűŽ´’Âę.<2E>]
|
||||||
|
ł{Q6uáT,9
|
After Width: | Height: | Size: 232 B |
|
@ -0,0 +1 @@
|
||||||
|
xÚí“Á
À E{vë& à&°Y+¢b¤öÐkŸ'yù‘¤¿ÌÁa :äÀTXl<58>Þ¶$W+Ó<>vû®îœ¢9}gRæ¬@H0YPB½ÆÃEmÚÚ?ûœÍ±ísœÖ"bµìt2cnÖé†É:½ïºë;¿Y§“ÃzÿQã«7¿Ô
|
After Width: | Height: | Size: 147 B |
After Width: | Height: | Size: 255 B |
|
@ -0,0 +1 @@
|
||||||
|
xÚíÜAƒ …a×Þº ØÉ
à&r³‚ Á´¸ªÎ4ù§«†´yù‚Ä·!¥mV3I<33>µv!ÒœÖ2¢i\NSSä4EF2<46>+65Å¥‰e¾þÃ/Wœs]šñ¾‰!„Á?ÿpÅõû¦=S~ùüÄ<C3BC>?Ëý+þx¦Ö6r6yö³Ùƹ}“Ç´™ë×eR1-<2D>W•l°Ál°Á›ûÒŒÞXŸz/>Væ«·ù§:ñÒÒÄAš8üý-+mTíÎÎbl°Ál°ÁlèštMº&]“³l°Ál°Áº&]“®I×ä¼Ál°Ál°Áº&]“®Éyƒ
6Ø`ƒ
6Ø`ƒÍÝi¬uy´ØXWòè±Éi¬²\t†ýz•—Š>•.î”z¾kÊß
t²¿7©ß7òwJõÏ”¶4Òw‘<77>ÒˆßÓÖÍ85‰
|
After Width: | Height: | Size: 260 B |
|
@ -0,0 +1,2 @@
|
||||||
|
xЪнЬБ
|
||||||
|
„ …бЦѕхЂ‹л.Я ЯDЯl¬,¦љMz‰я6›†Г‡ gcJЛD;ф'.®A’IqћЮ‰ДI,IrўYЁ»‘ЛFk%‰DюOжy|EDЄDЧы(LУ_YЌК>*Яљ?aКOѓїk±L_Ј<[c—с¶п>КcЛ<63>хuФLIдХ%В#Њ0В#Њ0В#ЊЮotСўљхµ}ЕЬ4Нfќv_)‰ВEўpъЏ¬h5R·Џ8Џ8і1В#Њ0В#Њ0ўУТiйґtZО#Њ0В#Њ0В#Њ0ўУТiйґtZО#Њ0В#Њ0В#Њ0ўУТiйґtZОlЊ0В#Њ0ВЈч9q"ўЙHЬњH™Qюќµп"ЫХL5}-ЭЬYЧѕУкёkм`¤в>¶zйёі®юЦ4&Тpчб!‘Љы!«щ`ї:5
|
After Width: | Height: | Size: 262 B |
|
@ -0,0 +1,14 @@
|
||||||
|
xЪнЬAѓ …aЧЮє‰‹™ќЬ@n7+*L++Ужџ®ут‰МbbЬ*LCп‘°‡‰ck™HҐrљ”j•ІђJ5Yнi~0•_«тЊыЧTКTх}е—e©>эц5‘b_еwРНџ?ї¤Ямж§ЦЬщ†\эRaЖi+7хЯW©¦\гюwLUNеL¦В
|
||||||
|
+¬°В
|
||||||
|
+¬°ВкяjЯТO·џkcлЮсфз\Л©|%•o<б‹k–Lо+О+Оv¬°В
|
||||||
|
+¬°В
|
||||||
|
+¬°ВЉ>}ъф8Ї°В
|
||||||
|
+¬°В
|
||||||
|
+¬°В
|
||||||
|
+ъфи3РgајВ
|
||||||
|
+¬°В
|
||||||
|
+¬°В
|
||||||
|
+¬и3Рg П@џЃу
|
||||||
|
+¬°В
|
||||||
|
+¬°В
|
||||||
|
+¬°:R‰ЁЄXіЪB‰9«”IФ=зkЮЏ±o/SwзШ<D0B7>™ЩЇП`g¶бЕКМИr_Щ™™YѕѓVSY™ЕzIefnmQoz
>б
|
After Width: | Height: | Size: 253 B |
After Width: | Height: | Size: 256 B |
After Width: | Height: | Size: 243 B |
After Width: | Height: | Size: 272 B |
After Width: | Height: | Size: 279 B |
|
@ -0,0 +1 @@
|
||||||
|
xÚíÝAªƒ0ÐŽÝuÁA2«;Ð<>èÎkü(üg¾Ày•tp9Äï$Ëò™¹Dœ”ò¼\ºe^'tÒ-aIºŠFMšSškÂðIóŤÓ:7®¤|LúkŸNã8N7®œöi}ö‡×Ÿi,Ÿ[W†¿g®Ó´Ì°ë?3ô1÷i™¾N·}}=ÂOM:4“”)S¦L™2eÊ”)S¦L#$½ÿ
ôÂJãþÂJM:}ý]˜•ÖL›Ù§ÎSÿQL™2eÊ”)S¦L™2Õ¡èPt(:Šó”)S¦L™2eÊ”)S¦:ŠE‡¢Cqž2eÊ”)S¦L™2eÊ”©E‡¢CÑ¡8O™2eÊ”)S¦L™2eÊT‡¢CÑ¡èPœ§L™2eÊ”)S¦L™2Ý“¦”sJCIKÖÔ‚iÍ93<7F>ônº_Ñòÿ¾¿ü¼“+R‡û®£“ièû£Žû4ö<34>\Çg¿¥¤‘ïŽ;%
}ßaÞnŽ£
|
After Width: | Height: | Size: 279 B |
After Width: | Height: | Size: 264 B |
|
@ -0,0 +1 @@
|
||||||
|
xÚí”Á
À E=»uÐ
pجQ•ØCOMŸ'ÃË<C383>$ ³@à¨Ø3e–F©\FNXRyÉؾC{‰a8RæŃa2@ñ圉qküßÉH1ê(£<>ˆÅ`cç¦j³~Ë0ö¥¿ÃܨÖËÃعnXÿGåÿ<>Ä€
|
After Width: | Height: | Size: 149 B |
|
@ -0,0 +1,2 @@
|
||||||
|
xΪνέA<EFBFBD>ƒ@Π¬½υ€‹ξ<E280B9>ή@oΆ7“<>`“QfeΊδ•«PA><3E>¦ΐΪτ<?jjo5WNiz<06>›yΊWύ‰σ΄&]ί…C?“I<>rώWβρ^;ο8·—
|
||||||
|
γύs<Γ°ϋφS{Ε9^gEί}>γ°<]ίΥΠλί³bZ«nγ¥^A›φQ}[χ9^<5E>]«yώμnajMά‡KΜ<4B>1cΖ<63>3fΜ<66>1γΈΖ{ίW5}η½{ΝΡ7lMί<4D>οή<CEBF>xάI<ΌαK½¨ΖαΞ±yl3fΜ<66>1cΖ<63>3fΜ<66>1γ«Ϋ»Ω»={·“Ξ±yl3fΜ<66>1cΖ<63>3fΜ<66>1γ«Ϋ»Ω»={·“Ξ±yl3fΜ<66>1cΖ<63>3fΜ<66>1γ«Ϋ»Ω»={·“Ξ±yl3fΜ<66>1cΖ<63>3fΜ<66>1γ«Ϋ»Ω»={·“Ξ±yl3fΜ<66>1cΖ<63>3fΜ<66>ρχη<>SΚ‘<CE9A>Σ’7¥HΖKήΌg\ηΎβuυίΟ_<CE9F><5F>r'4ά[ηή-Ζ]›…q<E280A6>ϋL·η8Ζ<38>±ΫY1q„»<E2809E>‹Δ!ξ—ήΤ/(%ϋ
|
After Width: | Height: | Size: 267 B |
|
@ -0,0 +1 @@
|
||||||
|
xÚí”1À E<>½u 7ЛÀÍZµ‡|N†—üDB0@R$l,-™>VKZ[<ýØÚz—qÆŽ¨ØYJ&ƒi<C692>åš‚‹ZyË:Y'ë¯YµÁVÿ&—e•RÄ"§sj©Ýrþö+Ëé‰ù.·MÆŽ»–Ó9ÓòzµsŽ”É,
|
After Width: | Height: | Size: 150 B |
After Width: | Height: | Size: 151 B |
After Width: | Height: | Size: 189 B |
After Width: | Height: | Size: 204 B |