From 5980da993ab74416d682aae160bfe204ff632914 Mon Sep 17 00:00:00 2001 From: Abdul Rahmad Pasaribu Date: Wed, 21 Feb 2024 16:40:05 +0700 Subject: [PATCH 1/6] Add PHPDoc documentation to the facade class --- src/Facades/QrCode.php | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/Facades/QrCode.php b/src/Facades/QrCode.php index 5207752..cb0cb3e 100644 --- a/src/Facades/QrCode.php +++ b/src/Facades/QrCode.php @@ -5,6 +5,38 @@ use Illuminate\Support\Facades\Facade; use SimpleSoftwareIO\QrCode\Generator; +/** + * @method static void|Illuminate\Support\HtmlString|string generate(string $text, string $filename = null) + * @method static \SimpleSoftwareIO\QrCode\Generator merge(string $filepath, float $percentage = .2, bool $absolute = false) + * @method static \SimpleSoftwareIO\QrCode\Generator mergeString(string $content, float $percentage = .2) + * @method static \SimpleSoftwareIO\QrCode\Generator size(int $pixels) + * @method static \SimpleSoftwareIO\QrCode\Generator format(string $format) + * @method static \SimpleSoftwareIO\QrCode\Generator color(int $red, int $green, int $blue, ?int $alpha = null) + * @method static \SimpleSoftwareIO\QrCode\Generator backgroundColor(int $red, int $green, int $blue, ?int $alpha = null) + * @method static \SimpleSoftwareIO\QrCode\Generator eyeColor(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0) + * @method static \SimpleSoftwareIO\QrCode\Generator gradient($startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type) + * @method static \SimpleSoftwareIO\QrCode\Generator eye(string $style) + * @method static \SimpleSoftwareIO\QrCode\Generator style(string $style, float $size = 0.5) + * @method static \SimpleSoftwareIO\QrCode\Generator encoding(string $encoding) + * @method static \SimpleSoftwareIO\QrCode\Generator errorCorrection(string $errorCorrection) + * @method static \SimpleSoftwareIO\QrCode\Generator margin(int $margin) + * @method static \BaconQrCode\Writer getWriter(ImageRenderer $renderer) + * @method static \BaconQrCode\ImageRenderer getRenderer() + * @method static \BaconQrCode\Renderer\RendererStyle\RendererStyle getRendererSytle() + * @method static \BaconQrCode\Renderer\Image\ImageBackEndInterface getFormatter() + * @method static \BaconQrCode\Renderer\Module\ModuleInterface getModule() + * @method static \BaconQrCode\Renderer\Eye\EyeInterface getEye() + * @method static \BaconQrCode\Renderer\RendererStyle\Fill getFill() + * @method static \BaconQrCode\Renderer\Color\ColorInterface createColor(int $red, int $green, int $blue, ?int $alpha = null) + * @method static void|Illuminate\Support\HtmlString|string BTC(string $address, string $amount, array $option = null) + * @method static void|Illuminate\Support\HtmlString|string Email(string $email, string $subject, string $body) + * @method static void|Illuminate\Support\HtmlString|string Geo(float $latitude, float $longitude) + * @method static void|Illuminate\Support\HtmlString|string PhoneNumber(string $phoneNumber) + * @method static void|Illuminate\Support\HtmlString|string SMS(string $phoneNumber, string $message) + * @method static void|Illuminate\Support\HtmlString|string WiFi(string $phoneNumber, string $message) + * + * @see \SimpleSoftwareIO\QrCode\Generator + */ class QrCode extends Facade { /** From c0ec66e2ae0b9f01ee910de0ec052810755404e8 Mon Sep 17 00:00:00 2001 From: Abdul Rahmad Pasaribu Date: Fri, 17 Jan 2025 11:27:09 +0700 Subject: [PATCH 2/6] build(deps): update composer dependencies --- composer.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 8594a91..213a8c4 100644 --- a/composer.json +++ b/composer.json @@ -11,13 +11,14 @@ } ], "require": { - "php": ">=7.2|^8.0", + "php": "^8.2", "ext-gd": "*", - "bacon/bacon-qr-code": "^2.0" + "bacon/bacon-qr-code": "^3.0", + "illuminate/support": "^11.0" }, "require-dev": { "mockery/mockery": "~1", - "phpunit/phpunit": "~9" + "phpunit/phpunit": "^11.0" }, "suggest": { "ext-imagick": "Allows the generation of PNG QrCodes.", From 5040a6fb7a5861867db2bff8a62f37237e2a247d Mon Sep 17 00:00:00 2001 From: Abdul Rahmad Pasaribu Date: Fri, 17 Jan 2025 11:29:39 +0700 Subject: [PATCH 3/6] refactor: refactor php code for better readability with VSCode --- src/DataTypes/BTC.php | 28 +++--- src/DataTypes/DataTypeInterface.php | 6 +- src/DataTypes/Email.php | 36 +++---- src/DataTypes/Geo.php | 17 ++-- src/DataTypes/PhoneNumber.php | 12 +-- src/DataTypes/SMS.php | 22 ++--- src/DataTypes/WiFi.php | 18 ++-- src/Facades/QrCode.php | 18 ++-- src/Generator.php | 145 ++++++---------------------- src/Image.php | 39 ++++---- src/ImageMerge.php | 78 +++++++-------- src/QrCodeServiceProvider.php | 6 +- 12 files changed, 150 insertions(+), 275 deletions(-) diff --git a/src/DataTypes/BTC.php b/src/DataTypes/BTC.php index fa55d81..393ace4 100644 --- a/src/DataTypes/BTC.php +++ b/src/DataTypes/BTC.php @@ -48,30 +48,24 @@ class BTC implements DataTypeInterface /** * Generates the DataType Object and sets all of its properties. - * - * @param $arguments */ - public function create(array $arguments) + public function create(array $arguments): void { $this->setProperties($arguments); } /** * Returns the correct QrCode format. - * - * @return string */ - public function __toString() + public function __toString(): string { return $this->buildBitCoinString(); } /** * Sets the BitCoin arguments. - * - * @param array $arguments */ - protected function setProperties(array $arguments) + protected function setProperties(array $arguments): self { if (isset($arguments[0])) { $this->address = $arguments[0]; @@ -84,14 +78,14 @@ protected function setProperties(array $arguments) if (isset($arguments[2])) { $this->setOptions($arguments[2]); } + + return $this; } /** * Sets the optional BitCoin options. - * - * @param array $options */ - protected function setOptions(array $options) + protected function setOptions(array $options): self { if (isset($options['label'])) { $this->label = $options['label']; @@ -104,23 +98,23 @@ protected function setOptions(array $options) if (isset($options['returnAddress'])) { $this->returnAddress = $options['returnAddress']; } + + return $this; } /** * Builds a BitCoin string. - * - * @return string */ - protected function buildBitCoinString() + protected function buildBitCoinString(): string { - $query = http_build_query([ + $query = \http_build_query([ 'amount' => $this->amount, 'label' => $this->label, 'message' => $this->message, 'r' => $this->returnAddress, ]); - $btc = $this->prefix.$this->address.'?'.$query; + $btc = $this->prefix . $this->address . '?' . $query; return $btc; } diff --git a/src/DataTypes/DataTypeInterface.php b/src/DataTypes/DataTypeInterface.php index cd52c90..55d96e7 100644 --- a/src/DataTypes/DataTypeInterface.php +++ b/src/DataTypes/DataTypeInterface.php @@ -7,12 +7,10 @@ interface DataTypeInterface /** * Generates the DataType Object and sets all of its properties. */ - public function create(array $arguments); + public function create(array $arguments): void; /** * Returns the correct QrCode format. - * - * @return string */ - public function __toString(); + public function __toString(): string; } diff --git a/src/DataTypes/Email.php b/src/DataTypes/Email.php index 37d4aca..8ef0daf 100644 --- a/src/DataTypes/Email.php +++ b/src/DataTypes/Email.php @@ -36,39 +36,33 @@ class Email implements DataTypeInterface /** * Generates the DataType Object and sets all of its properties. - * - * @param $arguments */ - public function create(array $arguments) + public function create(array $arguments): void { $this->setProperties($arguments); } /** * Returns the correct QrCode format. - * - * @return string */ - public function __toString() + public function __toString(): string { return $this->buildEmailString(); } /* * Builds the email string. - * - * @return string */ - protected function buildEmailString() + protected function buildEmailString(): string { - $email = $this->prefix.$this->email; + $email = $this->prefix . $this->email; if (isset($this->subject) || isset($this->body)) { $data = [ 'subject' => $this->subject, 'body' => $this->body, ]; - $email .= '?'.http_build_query($data); + $email .= '?' . \http_build_query($data); } return $email; @@ -76,10 +70,8 @@ protected function buildEmailString() /** * Sets the objects properties. - * - * @param $arguments */ - protected function setProperties(array $arguments) + protected function setProperties(array $arguments): self { if (isset($arguments[0])) { $this->setEmail($arguments[0]); @@ -90,28 +82,30 @@ protected function setProperties(array $arguments) if (isset($arguments[2])) { $this->body = $arguments[2]; } + + return $this; } /** * Sets the email property. - * - * @param $email + * + * @throws \BaconQrCode\Exception\InvalidArgumentException */ - protected function setEmail($email) + protected function setEmail(string $email): self { if ($this->isValidEmail($email)) { $this->email = $email; } + + return $this; } /** * Ensures an email is valid. * - * @param string $email - * - * @return bool + * @throws \BaconQrCode\Exception\InvalidArgumentException */ - protected function isValidEmail($email) + protected function isValidEmail(string $email): bool { if (! filter_var($email, FILTER_VALIDATE_EMAIL)) { throw new InvalidArgumentException('Invalid email provided'); diff --git a/src/DataTypes/Geo.php b/src/DataTypes/Geo.php index d51a36d..610b7cc 100644 --- a/src/DataTypes/Geo.php +++ b/src/DataTypes/Geo.php @@ -21,23 +21,21 @@ class Geo implements DataTypeInterface /** * The latitude. * - * @var + * @var double */ protected $latitude; /** * The longitude. * - * @var + * @var double */ protected $longitude; /** * Generates the DataType Object and sets all of its properties. - * - * @param $arguments */ - public function create(array $arguments) + public function create(array $arguments): void { $this->latitude = $arguments[0]; $this->longitude = $arguments[1]; @@ -45,11 +43,12 @@ public function create(array $arguments) /** * Returns the correct QrCode format. - * - * @return string */ - public function __toString() + public function __toString(): string { - return $this->prefix.$this->latitude.$this->separator.$this->longitude; + return $this->prefix + . \strval($this->latitude) + . $this->separator + . \strval($this->longitude); } } diff --git a/src/DataTypes/PhoneNumber.php b/src/DataTypes/PhoneNumber.php index ad27bdf..ea5be12 100644 --- a/src/DataTypes/PhoneNumber.php +++ b/src/DataTypes/PhoneNumber.php @@ -14,27 +14,23 @@ class PhoneNumber implements DataTypeInterface /** * The phone number. * - * @var + * @var string */ protected $phoneNumber; /** * Generates the DataType Object and sets all of its properties. - * - * @param $arguments */ - public function create(array $arguments) + public function create(array $arguments): void { $this->phoneNumber = $arguments[0]; } /** * Returns the correct QrCode format. - * - * @return string */ - public function __toString() + public function __toString(): string { - return $this->prefix.$this->phoneNumber; + return $this->prefix . $this->phoneNumber; } } diff --git a/src/DataTypes/SMS.php b/src/DataTypes/SMS.php index 8f766be..f69aa55 100644 --- a/src/DataTypes/SMS.php +++ b/src/DataTypes/SMS.php @@ -34,30 +34,24 @@ class SMS implements DataTypeInterface /** * Generates the DataType Object and sets all of its properties. - * - * @param $arguments */ - public function create(array $arguments) + public function create(array $arguments): void { $this->setProperties($arguments); } /** * Returns the correct QrCode format. - * - * @return string */ - public function __toString() + public function __toString(): string { return $this->buildSMSString(); } /** * Sets the phone number and message for a sms message. - * - * @param array $arguments */ - protected function setProperties(array $arguments) + protected function setProperties(array $arguments): self { if (isset($arguments[0])) { $this->phoneNumber = $arguments[0]; @@ -65,19 +59,19 @@ protected function setProperties(array $arguments) if (isset($arguments[1])) { $this->message = $arguments[1]; } + + return $this; } /** * Builds a SMS string. - * - * @return string */ - protected function buildSMSString() + protected function buildSMSString(): string { - $sms = $this->prefix.$this->phoneNumber; + $sms = $this->prefix . $this->phoneNumber; if (isset($this->message)) { - $sms .= $this->separator.$this->message; + $sms .= $this->separator . $this->message; } return $sms; diff --git a/src/DataTypes/WiFi.php b/src/DataTypes/WiFi.php index bb98cb4..b7cfb6f 100644 --- a/src/DataTypes/WiFi.php +++ b/src/DataTypes/WiFi.php @@ -48,30 +48,24 @@ class WiFi implements DataTypeInterface /** * Generates the DataType Object and sets all of its properties. - * - * @param $arguments */ - public function create(array $arguments) + public function create(array $arguments): void { $this->setProperties($arguments); } /** * Returns the correct QrCode format. - * - * @return string */ - public function __toString() + public function __toString(): string { return $this->buildWifiString(); } /** * Builds the WiFi string. - * - * @return string */ - protected function buildWifiString() + protected function buildWifiString(): string { $wifi = $this->prefix; @@ -93,10 +87,8 @@ protected function buildWifiString() /** * Sets the WiFi properties. - * - * @param $arguments */ - protected function setProperties(array $arguments) + protected function setProperties(array $arguments): self { $arguments = $arguments[0]; if (isset($arguments['encryption'])) { @@ -111,5 +103,7 @@ protected function setProperties(array $arguments) if (isset($arguments['hidden'])) { $this->hidden = $arguments['hidden']; } + + return $this; } } diff --git a/src/Facades/QrCode.php b/src/Facades/QrCode.php index cb0cb3e..e36d472 100644 --- a/src/Facades/QrCode.php +++ b/src/Facades/QrCode.php @@ -6,7 +6,7 @@ use SimpleSoftwareIO\QrCode\Generator; /** - * @method static void|Illuminate\Support\HtmlString|string generate(string $text, string $filename = null) + * @method static \Illuminate\Support\HtmlString|string|null generate(string $text, ?string $filename = null) * @method static \SimpleSoftwareIO\QrCode\Generator merge(string $filepath, float $percentage = .2, bool $absolute = false) * @method static \SimpleSoftwareIO\QrCode\Generator mergeString(string $content, float $percentage = .2) * @method static \SimpleSoftwareIO\QrCode\Generator size(int $pixels) @@ -28,12 +28,12 @@ * @method static \BaconQrCode\Renderer\Eye\EyeInterface getEye() * @method static \BaconQrCode\Renderer\RendererStyle\Fill getFill() * @method static \BaconQrCode\Renderer\Color\ColorInterface createColor(int $red, int $green, int $blue, ?int $alpha = null) - * @method static void|Illuminate\Support\HtmlString|string BTC(string $address, string $amount, array $option = null) - * @method static void|Illuminate\Support\HtmlString|string Email(string $email, string $subject, string $body) - * @method static void|Illuminate\Support\HtmlString|string Geo(float $latitude, float $longitude) - * @method static void|Illuminate\Support\HtmlString|string PhoneNumber(string $phoneNumber) - * @method static void|Illuminate\Support\HtmlString|string SMS(string $phoneNumber, string $message) - * @method static void|Illuminate\Support\HtmlString|string WiFi(string $phoneNumber, string $message) + * @method static \Illuminate\Support\HtmlString|string|null BTC(string $address, string $amount, array $option = null) + * @method static \Illuminate\Support\HtmlString|string|null Email(string $email, string $subject, string $body) + * @method static \Illuminate\Support\HtmlString|string|null Geo(float $latitude, float $longitude) + * @method static \Illuminate\Support\HtmlString|string|null PhoneNumber(string $phoneNumber) + * @method static \Illuminate\Support\HtmlString|string|null SMS(string $phoneNumber, string $message) + * @method static \Illuminate\Support\HtmlString|string|null WiFi(string $phoneNumber, string $message) * * @see \SimpleSoftwareIO\QrCode\Generator */ @@ -41,10 +41,8 @@ class QrCode extends Facade { /** * Get the registered name of the component. - * - * @return string */ - protected static function getFacadeAccessor() + protected static function getFacadeAccessor(): string { self::clearResolvedInstance(Generator::class); diff --git a/src/Generator.php b/src/Generator.php index 4ada416..7cf7057 100644 --- a/src/Generator.php +++ b/src/Generator.php @@ -4,7 +4,6 @@ use BaconQrCode\Common\ErrorCorrectionLevel; use BaconQrCode\Encoder\Encoder; -use BaconQrCode\Exception\WriterException; use BaconQrCode\Renderer\Color\Alpha; use BaconQrCode\Renderer\Color\ColorInterface; use BaconQrCode\Renderer\Color\Rgb; @@ -27,8 +26,7 @@ use BaconQrCode\Renderer\RendererStyle\GradientType; use BaconQrCode\Renderer\RendererStyle\RendererStyle; use BaconQrCode\Writer; -use BadMethodCallException; -use InvalidArgumentException; +use Illuminate\Support\HtmlString; use SimpleSoftwareIO\QrCode\DataTypes\DataTypeInterface; class Generator @@ -145,28 +143,22 @@ class Generator /** * Creates a new datatype object and then generates a QrCode. - * - * @param $method - * @param array $arguments */ - public function __call($method, array $arguments) + public function __call(string $method, array $arguments): HtmlString|string { $dataType = $this->createClass($method); $dataType->create($arguments); - return $this->generate(strval($dataType)); + return $this->generate(\strval($dataType)); } /** * Generates the QrCode. * - * @param string $text - * @param string|null $filename - * @return void|\Illuminate\Support\HtmlString|string - * @throws WriterException - * @throws InvalidArgumentException + * @throws \BaconQrCode\Exception\WriterException + * @throws \InvalidArgumentException */ - public function generate(string $text, string $filename = null) + public function generate(string $text, ?string $filename = null): HtmlString|string { $qrCode = $this->getWriter($this->getRenderer())->writeString($text, $this->encoding, $this->errorCorrection); @@ -176,13 +168,11 @@ public function generate(string $text, string $filename = null) } if ($filename) { - file_put_contents($filename, $qrCode); - - return; + \file_put_contents($filename, $qrCode); } - if (class_exists(\Illuminate\Support\HtmlString::class)) { - return new \Illuminate\Support\HtmlString($qrCode); + if (\class_exists(HtmlString::class)) { + return new HtmlString($qrCode); } return $qrCode; @@ -190,16 +180,11 @@ public function generate(string $text, string $filename = null) /** * Merges an image over the QrCode. - * - * @param string $filepath - * @param float $percentage - * @param SimpleSoftwareIO\QrCode\boolean|bool $absolute - * @return Generator */ public function merge(string $filepath, float $percentage = .2, bool $absolute = false): self { - if (function_exists('base_path') && ! $absolute) { - $filepath = base_path().$filepath; + if (\function_exists('base_path') && !$absolute) { + $filepath = base_path() . $filepath; } $this->imageMerge = file_get_contents($filepath); @@ -210,10 +195,6 @@ public function merge(string $filepath, float $percentage = .2, bool $absolute = /** * Merges an image string with the center of the QrCode. - * - * @param string $content - * @param float $percentage - * @return Generator */ public function mergeString(string $content, float $percentage = .2): self { @@ -225,9 +206,6 @@ public function mergeString(string $content, float $percentage = .2): self /** * Sets the size of the QrCode. - * - * @param int $pixels - * @return Generator */ public function size(int $pixels): self { @@ -238,15 +216,13 @@ public function size(int $pixels): self /** * Sets the format of the QrCode. - * - * @param string $format - * @return Generator + * * @throws InvalidArgumentException */ public function format(string $format): self { - if (! in_array($format, ['svg', 'eps', 'png'])) { - throw new InvalidArgumentException("\$format must be svg, eps, or png. {$format} is not a valid."); + if (!\in_array($format, ['svg', 'eps', 'png'])) { + throw new \InvalidArgumentException("\$format must be svg, eps, or png. {$format} is not a valid."); } $this->format = $format; @@ -256,12 +232,6 @@ public function format(string $format): self /** * Sets the foreground color of the QrCode. - * - * @param int $red - * @param int $green - * @param int $blue - * @param null|int $alpha - * @return Generator */ public function color(int $red, int $green, int $blue, ?int $alpha = null): self { @@ -272,12 +242,6 @@ public function color(int $red, int $green, int $blue, ?int $alpha = null): self /** * Sets the background color of the QrCode. - * - * @param int $red - * @param int $green - * @param int $blue - * @param null|int $alpha - * @return Generator */ public function backgroundColor(int $red, int $green, int $blue, ?int $alpha = null): self { @@ -288,21 +252,13 @@ public function backgroundColor(int $red, int $green, int $blue, ?int $alpha = n /** * Sets the eye color for the provided eye index. - * - * @param int $eyeNumber - * @param int $innerRed - * @param int $innerGreen - * @param int $innerBlue - * @param int $outterRed - * @param int $outterGreen - * @param int $outterBlue - * @return Generator + * * @throws InvalidArgumentException */ public function eyeColor(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0): self { if ($eyeNumber < 0 || $eyeNumber > 2) { - throw new InvalidArgumentException("\$eyeNumber must be 0, 1, or 2. {$eyeNumber} is not valid."); + throw new \InvalidArgumentException("\$eyeNumber must be 0, 1, or 2. {$eyeNumber} is not valid."); } $this->eyeColors[$eyeNumber] = new EyeFill( @@ -313,9 +269,12 @@ public function eyeColor(int $eyeNumber, int $innerRed, int $innerGreen, int $in return $this; } + /** + * Sets the gradient. + */ public function gradient($startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type): self { - $type = strtoupper($type); + $type = \strtoupper($type); $this->gradient = new Gradient( $this->createColor($startRed, $startGreen, $startBlue), $this->createColor($endRed, $endGreen, $endBlue), @@ -328,14 +287,12 @@ public function gradient($startRed, $startGreen, $startBlue, $endRed, $endGreen, /** * Sets the eye style. * - * @param string $style - * @return Generator * @throws InvalidArgumentException */ public function eye(string $style): self { - if (! in_array($style, ['square', 'circle'])) { - throw new InvalidArgumentException("\$style must be square or circle. {$style} is not a valid eye style."); + if (!\in_array($style, ['square', 'circle'])) { + throw new \InvalidArgumentException("\$style must be square or circle. {$style} is not a valid eye style."); } $this->eyeStyle = $style; @@ -346,19 +303,16 @@ public function eye(string $style): self /** * Sets the style of the blocks for the QrCode. * - * @param string $style - * @param float $size - * @return Generator * @throws InvalidArgumentException */ public function style(string $style, float $size = 0.5): self { - if (! in_array($style, ['square', 'dot', 'round'])) { - throw new InvalidArgumentException("\$style must be square, dot, or round. {$style} is not a valid."); + if (!\in_array($style, ['square', 'dot', 'round'])) { + throw new \InvalidArgumentException("\$style must be square, dot, or round. {$style} is not a valid."); } if ($size < 0 || $size >= 1) { - throw new InvalidArgumentException("\$size must be between 0 and 1. {$size} is not valid."); + throw new \InvalidArgumentException("\$size must be between 0 and 1. {$size} is not valid."); } $this->style = $style; @@ -375,13 +329,10 @@ public function style(string $style, float $size = 0.5): self * ISO-8859-12, ISO-8859-13, ISO-8859-14, ISO-8859-15, ISO-8859-16, * SHIFT-JIS, WINDOWS-1250, WINDOWS-1251, WINDOWS-1252, WINDOWS-1256, * UTF-16BE, UTF-8, ASCII, GBK, EUC-KR. - * - * @param string $encoding - * @return Generator */ public function encoding(string $encoding): self { - $this->encoding = strtoupper($encoding); + $this->encoding = \strtoupper($encoding); return $this; } @@ -392,13 +343,10 @@ public function encoding(string $encoding): self * M: 15% loss. * Q: 25% loss. * H: 30% loss. - * - * @param string $errorCorrection - * @return Generator */ public function errorCorrection(string $errorCorrection): self { - $errorCorrection = strtoupper($errorCorrection); + $errorCorrection = \strtoupper($errorCorrection); $this->errorCorrection = ErrorCorrectionLevel::$errorCorrection(); return $this; @@ -406,9 +354,6 @@ public function errorCorrection(string $errorCorrection): self /** * Sets the margin of the QrCode. - * - * @param int $margin - * @return Generator */ public function margin(int $margin): self { @@ -419,9 +364,6 @@ public function margin(int $margin): self /** * Fetches the Writer. - * - * @param ImageRenderer $renderer - * @return Writer */ public function getWriter(ImageRenderer $renderer): Writer { @@ -430,8 +372,6 @@ public function getWriter(ImageRenderer $renderer): Writer /** * Fetches the Image Renderer. - * - * @return ImageRenderer */ public function getRenderer(): ImageRenderer { @@ -445,8 +385,6 @@ public function getRenderer(): ImageRenderer /** * Returns the Renderer Style. - * - * @return RendererStyle */ public function getRendererStyle(): RendererStyle { @@ -455,8 +393,6 @@ public function getRendererStyle(): RendererStyle /** * Fetches the formatter. - * - * @return ImageBackEndInterface */ public function getFormatter(): ImageBackEndInterface { @@ -473,8 +409,6 @@ public function getFormatter(): ImageBackEndInterface /** * Fetches the module. - * - * @return ModuleInterface */ public function getModule(): ModuleInterface { @@ -491,8 +425,6 @@ public function getModule(): ModuleInterface /** * Fetches the eye style. - * - * @return EyeInterface */ public function getEye(): EyeInterface { @@ -509,8 +441,6 @@ public function getEye(): EyeInterface /** * Fetches the color fill. - * - * @return Fill */ public function getFill(): Fill { @@ -529,15 +459,10 @@ public function getFill(): Fill /** * Creates a RGB or Alpha channel color. - * @param int $red - * @param int $green - * @param int $blue - * @param null|int $alpha - * @return ColorInterface */ public function createColor(int $red, int $green, int $blue, ?int $alpha = null): ColorInterface { - if (is_null($alpha)) { + if (\is_null($alpha)) { return new Rgb($red, $green, $blue); } @@ -546,16 +471,13 @@ public function createColor(int $red, int $green, int $blue, ?int $alpha = null) /** * Creates a new DataType class dynamically. - * - * @param string $method - * @return DataTypeInterface */ protected function createClass(string $method): DataTypeInterface { $class = $this->formatClass($method); - if (! class_exists($class)) { - throw new BadMethodCallException(); + if (! \class_exists($class)) { + throw new \BadMethodCallException(); } return new $class(); @@ -563,15 +485,12 @@ protected function createClass(string $method): DataTypeInterface /** * Formats the method name correctly. - * - * @param $method - * @return string */ protected function formatClass(string $method): string { - $method = ucfirst($method); + $method = \ucfirst($method); - $class = "SimpleSoftwareIO\QrCode\DataTypes\\".$method; + $class = "SimpleSoftwareIO\QrCode\DataTypes\\" . $method; return $class; } diff --git a/src/Image.php b/src/Image.php index 02bd83c..b83da57 100644 --- a/src/Image.php +++ b/src/Image.php @@ -7,57 +7,56 @@ class Image /** * Holds the image resource. * - * @var resource + * @var \GdImage */ protected $image; /** * Creates a new Image object. - * - * @param $image string An image string + * + * @throws \Exception */ - public function __construct($image) + public function __construct(string $image) { - $this->image = imagecreatefromstring($image); + $gdImage = \imagecreatefromstring($image); + if (!($gdImage instanceof \GdImage)) { + throw new \Exception('Can\'t create image from given string.'); + } + + $this->image = $gdImage; } /* * Returns the width of an image - * - * @return int - */ - public function getWidth() + */ + public function getWidth(): int|false { - return imagesx($this->image); + return \imagesx($this->image); } /* * Returns the height of an image - * - * @return int */ - public function getHeight() + public function getHeight(): int|false { - return imagesy($this->image); + return \imagesy($this->image); } /** * Returns the image string. - * - * @return string */ - public function getImageResource() + public function getImageResource(): \GdImage { return $this->image; } /** * Sets the image string. - * - * @param resource $image */ - public function setImageResource($image) + public function setImageResource(\GdImage $image): self { $this->image = $image; + + return $this; } } diff --git a/src/ImageMerge.php b/src/ImageMerge.php index f83e35d..b001bd3 100644 --- a/src/ImageMerge.php +++ b/src/ImageMerge.php @@ -9,14 +9,14 @@ class ImageMerge /** * Holds the QrCode image. * - * @var Image + * @var \SimpleSoftwareIO\QrCode\Image */ protected $sourceImage; /** * Holds the merging image. * - * @var Image + * @var \SimpleSoftwareIO\QrCode\Image */ protected $mergeImage; @@ -86,33 +86,36 @@ class ImageMerge /** * Creates a new ImageMerge object. * - * @param $sourceImage Image The image that will be merged over. - * @param $mergeImage Image The image that will be used to merge with $sourceImage + * @param \SimpleSoftwareIO\QrCode\Image $sourceImage Image The image that will be merged over. + * @param \SimpleSoftwareIO\QrCode\Image $mergeImage Image The image that will be used to merge with $sourceImage */ public function __construct(Image $sourceImage, Image $mergeImage) { $this->sourceImage = $sourceImage; + $this->sourceImageHeight = $sourceImage->getHeight(); + $this->sourceImageWidth = $sourceImage->getWidth(); + $this->mergeImage = $mergeImage; + $this->mergeImageHeight = $mergeImage->getHeight(); + $this->mergeImageWidth = $mergeImage->getWidth(); } /** * Returns an QrCode that has been merge with another image. * This is usually used with logos to imprint a logo into a QrCode. * - * @param $percentage float The percentage of size relative to the entire QR of the merged image - * - * @return string + * @param float $percentage The percentage of size relative to the entire QR of the merged image */ - public function merge($percentage) + public function merge(float $percentage): string|false { $this->setProperties($percentage); - $img = imagecreatetruecolor($this->sourceImage->getWidth(), $this->sourceImage->getHeight()); - imagealphablending($img, true); - $transparent = imagecolorallocatealpha($img, 0, 0, 0, 127); - imagefill($img, 0, 0, $transparent); + $img = \imagecreatetruecolor($this->sourceImage->getWidth(), $this->sourceImage->getHeight()); + \imagealphablending($img, true); + $transparent = \imagecolorallocatealpha($img, 0, 0, 0, 127); + \imagefill($img, 0, 0, $transparent); - imagecopy( + \imagecopy( $img, $this->sourceImage->getImageResource(), 0, @@ -123,7 +126,7 @@ public function merge($percentage) $this->sourceImage->getHeight() ); - imagecopyresampled( + \imagecopyresampled( $img, $this->mergeImage->getImageResource(), $this->centerX, @@ -143,62 +146,51 @@ public function merge($percentage) /** * Creates a PNG Image. - * - * @return string */ - protected function createImage() + protected function createImage(): string|false { - ob_start(); + \ob_start(); imagepng($this->sourceImage->getImageResource()); - return ob_get_clean(); + return \ob_get_clean(); } /** * Sets the objects properties. * - * @param $percentage float The percentage that the merge image should take up. - * - * @return void + * @param float $percentage The percentage that the merge image should take up. */ - protected function setProperties($percentage) + protected function setProperties(float $percentage): self { if ($percentage > 1) { throw new InvalidArgumentException('$percentage must be less than 1'); } - $this->sourceImageHeight = $this->sourceImage->getHeight(); - $this->sourceImageWidth = $this->sourceImage->getWidth(); - - $this->mergeImageHeight = $this->mergeImage->getHeight(); - $this->mergeImageWidth = $this->mergeImage->getWidth(); + $this->calculateOverlap($percentage)->calculateCenter(); - $this->calculateOverlap($percentage); - $this->calculateCenter(); + return $this; } /** * Calculates the center of the source Image using the Merge image. - * - * @return void */ - protected function calculateCenter() + protected function calculateCenter(): self { - $this->centerX = intval(($this->sourceImageWidth / 2) - ($this->postMergeImageWidth / 2)); - $this->centerY = intval(($this->sourceImageHeight / 2) - ($this->postMergeImageHeight / 2)); + $this->centerX = \intval(($this->sourceImageWidth / 2) - ($this->postMergeImageWidth / 2)); + $this->centerY = \intval(($this->sourceImageHeight / 2) - ($this->postMergeImageHeight / 2)); + + return $this; } /** * Calculates the width of the merge image being placed on the source image. - * - * @param float $percentage - * - * @return void */ - protected function calculateOverlap($percentage) + protected function calculateOverlap(float $percentage): self { - $this->mergeRatio = round($this->mergeImageWidth / $this->mergeImageHeight, 2); - $this->postMergeImageWidth = intval($this->sourceImageWidth * $percentage); - $this->postMergeImageHeight = intval($this->postMergeImageWidth / $this->mergeRatio); + $this->mergeRatio = \round($this->mergeImageWidth / $this->mergeImageHeight, 2); + $this->postMergeImageWidth = \intval($this->sourceImageWidth * $percentage); + $this->postMergeImageHeight = \intval($this->postMergeImageWidth / $this->mergeRatio); + + return $this; } } diff --git a/src/QrCodeServiceProvider.php b/src/QrCodeServiceProvider.php index da37eb9..98a748f 100644 --- a/src/QrCodeServiceProvider.php +++ b/src/QrCodeServiceProvider.php @@ -9,7 +9,7 @@ class QrCodeServiceProvider extends ServiceProvider /** * Register the service provider. */ - public function register() + public function register(): void { $this->app->bind('qrcode', function () { return new Generator(); @@ -18,10 +18,8 @@ public function register() /** * Get the services provided by the provider. - * - * @return array */ - public function provides() + public function provides(): array { return [Generator::class]; } From 32ef9749547769ac3166b11b6619019cb17bf6cc Mon Sep 17 00:00:00 2001 From: Abdul Rahmad Pasaribu Date: Fri, 17 Jan 2025 11:30:48 +0700 Subject: [PATCH 4/6] tests: refactor & fix test cases to work with phpunit 11 --- .gitignore | 1 + phpunit.xml | 10 ++++---- tests/DataTypes/BTCTest.php | 19 +++++++++----- tests/DataTypes/EmailTest.php | 25 ++++++++++-------- tests/DataTypes/GeoTest.php | 4 +-- tests/DataTypes/PhoneNumberTest.php | 4 +-- tests/DataTypes/SMSTest.php | 17 +++++++----- tests/DataTypes/WiFiTest.php | 21 +++++++++------ tests/GeneratorTest.php | 40 ++++++++++++++--------------- tests/ImageMergeTest.php | 29 +++++++++++---------- tests/ImageTest.php | 26 +++++++++---------- 11 files changed, 109 insertions(+), 87 deletions(-) diff --git a/.gitignore b/.gitignore index d23f2c0..0c53d25 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ .idea +/.phpunit.cache /vendor composer.lock \ No newline at end of file diff --git a/phpunit.xml b/phpunit.xml index e4bfa04..2216bb7 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,11 +1,11 @@ - diff --git a/tests/DataTypes/BTCTest.php b/tests/DataTypes/BTCTest.php index 04b3e49..6355eb4 100644 --- a/tests/DataTypes/BTCTest.php +++ b/tests/DataTypes/BTCTest.php @@ -5,30 +5,35 @@ class BTCTest extends TestCase { + /** + * @var \SimpleSoftwareIO\QrCode\DataTypes\BTC + */ + protected $btc; + public function setUp(): void { $this->btc = new BTC(); } - public function test_it_generates_a_valid_btc_qrcode_with_an_address_and_amount() + public function test_it_generates_a_valid_btc_qrcode_with_an_address_and_amount(): void { $this->btc->create(['btcaddress', 0.0034]); $properFormat = 'bitcoin:btcaddress?amount=0.0034'; - $this->assertEquals($properFormat, strval($this->btc)); + $this->assertEquals($properFormat, \strval($this->btc)); } - public function test_it_generates_a_valid_btc_qrcode_with_an_address_amount_and_label() + public function test_it_generates_a_valid_btc_qrcode_with_an_address_amount_and_label(): void { $this->btc->create(['btcaddress', 0.0034, ['label' => 'label']]); $properFormat = 'bitcoin:btcaddress?amount=0.0034&label=label'; - $this->assertEquals($properFormat, strval($this->btc)); + $this->assertEquals($properFormat, \strval($this->btc)); } - public function test_it_generates_a_valid_btc_qrcode_with_an_address_amount_label_message_and_return_address() + public function test_it_generates_a_valid_btc_qrcode_with_an_address_amount_label_message_and_return_address(): void { $this->btc->create([ 'btcaddress', @@ -40,8 +45,8 @@ public function test_it_generates_a_valid_btc_qrcode_with_an_address_amount_labe ], ]); - $properFormat = 'bitcoin:btcaddress?amount=0.0034&label=label&message=message&r='.urlencode('https://www.returnaddress.com'); + $properFormat = 'bitcoin:btcaddress?amount=0.0034&label=label&message=message&r=' . \urlencode('https://www.returnaddress.com'); - $this->assertEquals($properFormat, strval($this->btc)); + $this->assertEquals($properFormat, \strval($this->btc)); } } diff --git a/tests/DataTypes/EmailTest.php b/tests/DataTypes/EmailTest.php index 17a6931..143740e 100644 --- a/tests/DataTypes/EmailTest.php +++ b/tests/DataTypes/EmailTest.php @@ -5,50 +5,55 @@ class EmailTest extends TestCase { + /** + * @var \SimpleSoftwareIO\QrCode\DataTypes\Email + */ + protected $email; + public function setUp(): void { $this->email = new Email(); } - public function test_it_generates_the_proper_format_when_only_an_email_address_is_supplied() + public function test_it_generates_the_proper_format_when_only_an_email_address_is_supplied(): void { $this->email->create(['foo@bar.com']); $properFormat = 'mailto:foo@bar.com'; - $this->assertEquals($properFormat, strval($this->email)); + $this->assertEquals($properFormat, \strval($this->email)); } - public function test_it_generates_the_proper_format_when_an_email_subject_and_body_are_supplied() + public function test_it_generates_the_proper_format_when_an_email_subject_and_body_are_supplied(): void { $this->email->create(['foo@bar.com', 'foo', 'bar']); $properFormat = 'mailto:foo@bar.com?subject=foo&body=bar'; - $this->assertEquals($properFormat, strval($this->email)); + $this->assertEquals($properFormat, \strval($this->email)); } - public function test_it_generates_the_proper_format_when_an_email_and_subject_are_supplied() + public function test_it_generates_the_proper_format_when_an_email_and_subject_are_supplied(): void { $this->email->create(['foo@bar.com', 'foo']); $properFormat = 'mailto:foo@bar.com?subject=foo'; - $this->assertEquals($properFormat, strval($this->email)); + $this->assertEquals($properFormat, \strval($this->email)); } - public function test_it_generates_the_proper_format_when_only_a_subject_is_provided() + public function test_it_generates_the_proper_format_when_only_a_subject_is_provided(): void { $this->email->create([null, 'foo']); $properFormat = 'mailto:?subject=foo'; - $this->assertEquals($properFormat, strval($this->email)); + $this->assertEquals($properFormat, \strval($this->email)); } - public function test_it_throws_an_exception_when_an_invalid_email_is_given() + public function test_it_throws_an_exception_when_an_invalid_email_is_given(): void { - $this->expectException(InvalidArgumentException::class); + $this->expectException(\InvalidArgumentException::class); $this->email->create(['foo']); } diff --git a/tests/DataTypes/GeoTest.php b/tests/DataTypes/GeoTest.php index 3ec4b7e..d7f3ab0 100644 --- a/tests/DataTypes/GeoTest.php +++ b/tests/DataTypes/GeoTest.php @@ -5,13 +5,13 @@ class GeoTest extends TestCase { - public function test_it_generates_the_proper_format_for_a_geo_coordinate() + public function test_it_generates_the_proper_format_for_a_geo_coordinate(): void { $geo = new Geo(); $geo->create([10.254, -30.254]); $properFormat = 'geo:10.254,-30.254'; - $this->assertEquals($properFormat, strval($geo)); + $this->assertEquals($properFormat, \strval($geo)); } } diff --git a/tests/DataTypes/PhoneNumberTest.php b/tests/DataTypes/PhoneNumberTest.php index a3a7b8b..e87b80a 100644 --- a/tests/DataTypes/PhoneNumberTest.php +++ b/tests/DataTypes/PhoneNumberTest.php @@ -5,13 +5,13 @@ class PhoneNumberTest extends TestCase { - public function test_it_generates_the_proper_format_for_calling_a_phone_number() + public function test_it_generates_the_proper_format_for_calling_a_phone_number(): void { $phoneNumber = new PhoneNumber(); $phoneNumber->create(['555-555-5555']); $properFormat = 'tel:555-555-5555'; - $this->assertEquals($properFormat, strval($phoneNumber)); + $this->assertEquals($properFormat, \strval($phoneNumber)); } } diff --git a/tests/DataTypes/SMSTest.php b/tests/DataTypes/SMSTest.php index 42a6e43..101be2e 100644 --- a/tests/DataTypes/SMSTest.php +++ b/tests/DataTypes/SMSTest.php @@ -5,35 +5,40 @@ class SMSTest extends TestCase { + /** + * @var \SimpleSoftwareIO\QrCode\DataTypes\SMS + */ + protected $sms; + public function setUp(): void { $this->sms = new SMS(); } - public function test_it_generates_a_proper_format_with_a_phone_number() + public function test_it_generates_a_proper_format_with_a_phone_number(): void { $this->sms->create(['555-555-5555']); $properFormat = 'sms:555-555-5555'; - $this->assertEquals($properFormat, strval($this->sms)); + $this->assertEquals($properFormat, \strval($this->sms)); } - public function test_it_generate_a_proper_format_with_a_message() + public function test_it_generate_a_proper_format_with_a_message(): void { $this->sms->create([null, 'foo']); $properFormat = 'sms:&body=foo'; - $this->assertEquals($properFormat, strval($this->sms)); + $this->assertEquals($properFormat, \strval($this->sms)); } - public function test_it_generates_a_proper_format_with_a_phone_number_and_message() + public function test_it_generates_a_proper_format_with_a_phone_number_and_message(): void { $this->sms->create(['555-555-5555', 'foo']); $properFormat = 'sms:555-555-5555&body=foo'; - $this->assertEquals($properFormat, strval($this->sms)); + $this->assertEquals($properFormat, \strval($this->sms)); } } diff --git a/tests/DataTypes/WiFiTest.php b/tests/DataTypes/WiFiTest.php index 246e1bf..56eba7b 100644 --- a/tests/DataTypes/WiFiTest.php +++ b/tests/DataTypes/WiFiTest.php @@ -5,12 +5,17 @@ class WiFiTest extends TestCase { + /** + * @var \SimpleSoftwareIO\QrCode\DataTypes\WiFi + */ + protected $wifi; + public function setUp(): void { $this->wifi = new Wifi(); } - public function test_it_generates_a_proper_format_with_just_the_ssid() + public function test_it_generates_a_proper_format_with_just_the_ssid(): void { $this->wifi->create([ 0 => [ @@ -20,10 +25,10 @@ public function test_it_generates_a_proper_format_with_just_the_ssid() $properFormat = 'WIFI:S:foo;'; - $this->assertEquals($properFormat, strval($this->wifi)); + $this->assertEquals($properFormat, \strval($this->wifi)); } - public function test_it_generates_a_proper_format_for_a_ssid_that_is_hidden() + public function test_it_generates_a_proper_format_for_a_ssid_that_is_hidden(): void { $this->wifi->create([ 0 => [ @@ -34,10 +39,10 @@ public function test_it_generates_a_proper_format_for_a_ssid_that_is_hidden() $properFormat = 'WIFI:S:foo;H:true;'; - $this->assertEquals($properFormat, strval($this->wifi)); + $this->assertEquals($properFormat, \strval($this->wifi)); } - public function test_it_generates_a_proper_format_for_a_ssid_encryption_and_password() + public function test_it_generates_a_proper_format_for_a_ssid_encryption_and_password(): void { $this->wifi->create([ 0 => [ @@ -49,10 +54,10 @@ public function test_it_generates_a_proper_format_for_a_ssid_encryption_and_pass $properFormat = 'WIFI:T:WPA;S:foo;P:bar;'; - $this->assertEquals($properFormat, strval($this->wifi)); + $this->assertEquals($properFormat, \strval($this->wifi)); } - public function test_it_generates_a_proper_format_for_a_ssid_encryption_password_and_is_hidden() + public function test_it_generates_a_proper_format_for_a_ssid_encryption_password_and_is_hidden(): void { $this->wifi->create([ 0 => [ @@ -65,6 +70,6 @@ public function test_it_generates_a_proper_format_for_a_ssid_encryption_password $properFormat = 'WIFI:T:WPA;S:foo;P:bar;H:true;'; - $this->assertEquals($properFormat, strval($this->wifi)); + $this->assertEquals($properFormat, \strval($this->wifi)); } } diff --git a/tests/GeneratorTest.php b/tests/GeneratorTest.php index d0d75be..b799391 100644 --- a/tests/GeneratorTest.php +++ b/tests/GeneratorTest.php @@ -97,27 +97,27 @@ public function test_eye_color_is_set() $generator = $generator->eyeColor(1, 0, 0, 0, 255, 255, 255); $generator = $generator->eyeColor(2, 0, 0, 0, 255, 255, 255); - $this->assertEquals(0, $generator->getFill()->getTopLeftEyeFill()->getExternalColor()->getRed()); - $this->assertEquals(0, $generator->getFill()->getTopLeftEyeFill()->getExternalColor()->getGreen()); - $this->assertEquals(0, $generator->getFill()->getTopLeftEyeFill()->getExternalColor()->getBlue()); - $this->assertEquals(255, $generator->getFill()->getTopLeftEyeFill()->getInternalColor()->getRed()); - $this->assertEquals(255, $generator->getFill()->getTopLeftEyeFill()->getInternalColor()->getGreen()); - $this->assertEquals(255, $generator->getFill()->getTopLeftEyeFill()->getInternalColor()->getBlue()); - - $this->assertEquals(0, $generator->getFill()->getTopRightEyeFill()->getExternalColor()->getRed()); - $this->assertEquals(0, $generator->getFill()->getTopRightEyeFill()->getExternalColor()->getGreen()); - $this->assertEquals(0, $generator->getFill()->getTopRightEyeFill()->getExternalColor()->getBlue()); - $this->assertEquals(255, $generator->getFill()->getTopRightEyeFill()->getInternalColor()->getRed()); - $this->assertEquals(255, $generator->getFill()->getTopRightEyeFill()->getInternalColor()->getGreen()); - $this->assertEquals(255, $generator->getFill()->getTopRightEyeFill()->getInternalColor()->getBlue()); + $this->assertEquals(0, $generator->getFill()->getTopLeftEyeFill()->getExternalColor()->toRgb()->getRed()); + $this->assertEquals(0, $generator->getFill()->getTopLeftEyeFill()->getExternalColor()->toRgb()->getGreen()); + $this->assertEquals(0, $generator->getFill()->getTopLeftEyeFill()->getExternalColor()->toRgb()->getBlue()); + $this->assertEquals(255, $generator->getFill()->getTopLeftEyeFill()->getInternalColor()->toRgb()->getRed()); + $this->assertEquals(255, $generator->getFill()->getTopLeftEyeFill()->getInternalColor()->toRgb()->getGreen()); + $this->assertEquals(255, $generator->getFill()->getTopLeftEyeFill()->getInternalColor()->toRgb()->getBlue()); + + $this->assertEquals(0, $generator->getFill()->getTopRightEyeFill()->getExternalColor()->toRgb()->getRed()); + $this->assertEquals(0, $generator->getFill()->getTopRightEyeFill()->getExternalColor()->toRgb()->getGreen()); + $this->assertEquals(0, $generator->getFill()->getTopRightEyeFill()->getExternalColor()->toRgb()->getBlue()); + $this->assertEquals(255, $generator->getFill()->getTopRightEyeFill()->getInternalColor()->toRgb()->getRed()); + $this->assertEquals(255, $generator->getFill()->getTopRightEyeFill()->getInternalColor()->toRgb()->getGreen()); + $this->assertEquals(255, $generator->getFill()->getTopRightEyeFill()->getInternalColor()->toRgb()->getBlue()); $generator = (new Generator)->eyeColor(2, 0, 0, 0, 255, 255, 255); - $this->assertEquals(0, $generator->getFill()->getBottomLeftEyeFill()->getExternalColor()->getRed()); - $this->assertEquals(0, $generator->getFill()->getBottomLeftEyeFill()->getExternalColor()->getGreen()); - $this->assertEquals(0, $generator->getFill()->getBottomLeftEyeFill()->getExternalColor()->getBlue()); - $this->assertEquals(255, $generator->getFill()->getBottomLeftEyeFill()->getInternalColor()->getRed()); - $this->assertEquals(255, $generator->getFill()->getBottomLeftEyeFill()->getInternalColor()->getGreen()); - $this->assertEquals(255, $generator->getFill()->getBottomLeftEyeFill()->getInternalColor()->getBlue()); + $this->assertEquals(0, $generator->getFill()->getBottomLeftEyeFill()->getExternalColor()->toRgb()->getRed()); + $this->assertEquals(0, $generator->getFill()->getBottomLeftEyeFill()->getExternalColor()->toRgb()->getGreen()); + $this->assertEquals(0, $generator->getFill()->getBottomLeftEyeFill()->getExternalColor()->toRgb()->getBlue()); + $this->assertEquals(255, $generator->getFill()->getBottomLeftEyeFill()->getInternalColor()->toRgb()->getRed()); + $this->assertEquals(255, $generator->getFill()->getBottomLeftEyeFill()->getInternalColor()->toRgb()->getGreen()); + $this->assertEquals(255, $generator->getFill()->getBottomLeftEyeFill()->getInternalColor()->toRgb()->getBlue()); } public function test_eye_color_throws_exception_with_number_greater_than_2() @@ -197,7 +197,7 @@ public function test_get_renderer_returns_renderer() public function test_it_calls_a_valid_dynamic_method_and_generates_a_qrcode() { $result = (new Generator)->btc('1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa'); - $this->assertEquals("\n\n", $result); + $this->assertEquals("\n\n", $result); } public function test_it_throws_an_exception_if_datatype_is_not_found() diff --git a/tests/ImageMergeTest.php b/tests/ImageMergeTest.php index c1af0f0..71b43f6 100644 --- a/tests/ImageMergeTest.php +++ b/tests/ImageMergeTest.php @@ -23,7 +23,7 @@ class ImageMergeTest extends TestCase /** * The ImageMerge Object. * - * @var ImageMerge + * @var \SimpleSoftwareIO\QrCode\ImageMerge */ protected $testImage; @@ -36,37 +36,38 @@ class ImageMergeTest extends TestCase /** * The location of the test image that is being merged. + * * @var mixed */ protected $mergeImagePath; public function setUp(): void { - $this->testImagePath = file_get_contents(dirname(__FILE__).'/Images/simplesoftware-icon-grey-blue.png'); - $this->mergeImagePath = file_get_contents(dirname(__FILE__).'/Images/200x300.png'); + $this->testImagePath = \file_get_contents(\dirname(__FILE__) . '/Images/simplesoftware-icon-grey-blue.png'); + $this->mergeImagePath = \file_get_contents(\dirname(__FILE__) . '/Images/200x300.png'); $this->testImage = new ImageMerge( new Image($this->testImagePath), new Image($this->mergeImagePath) ); - $this->testImageSaveLocation = dirname(__FILE__).'/testImage.png'; - $this->compareTestSaveLocation = dirname(__FILE__).'/compareImage.png'; + $this->testImageSaveLocation = \dirname(__FILE__) . '/testImage.png'; + $this->compareTestSaveLocation = \dirname(__FILE__) . '/compareImage.png'; } public function tearDown(): void { - @unlink($this->testImageSaveLocation); - @unlink($this->compareTestSaveLocation); + @\unlink($this->testImageSaveLocation); + @\unlink($this->compareTestSaveLocation); } - public function test_it_merges_two_images_together_and_centers_it() + public function test_it_merges_two_images_together_and_centers_it(): void { //We know the source image is 512x512 and the merge image is 200x300 - $source = imagecreatefromstring($this->testImagePath); - $merge = imagecreatefromstring($this->mergeImagePath); + $source = \imagecreatefromstring($this->testImagePath); + $merge = \imagecreatefromstring($this->mergeImagePath); //Create a PNG and place the image in the middle using 20% of the area. - imagecopyresampled( + \imagecopyresampled( $source, $merge, 205, @@ -78,12 +79,12 @@ public function test_it_merges_two_images_together_and_centers_it() 536, 354 ); - imagepng($source, $this->compareTestSaveLocation); + \imagepng($source, $this->compareTestSaveLocation); $testImage = $this->testImage->merge(.2); - file_put_contents($this->testImageSaveLocation, $testImage); + \file_put_contents($this->testImageSaveLocation, $testImage); - $this->assertEquals(file_get_contents($this->compareTestSaveLocation), file_get_contents($this->testImageSaveLocation)); + $this->assertEquals(\file_get_contents($this->compareTestSaveLocation), \file_get_contents($this->testImageSaveLocation)); } public function test_it_throws_an_exception_when_percentage_is_greater_than_1() diff --git a/tests/ImageTest.php b/tests/ImageTest.php index f242979..b565ade 100644 --- a/tests/ImageTest.php +++ b/tests/ImageTest.php @@ -29,40 +29,40 @@ class ImageTest extends TestCase /** * The Image object. * - * @var Image + * @var \SimpleSoftwareIO\QrCode\Image */ protected $image; public function setUp(): void { - $this->imagePath = file_get_contents(dirname(__FILE__).'/Images/simplesoftware-icon-grey-blue.png'); + $this->imagePath = \file_get_contents(\dirname(__FILE__) . '/Images/simplesoftware-icon-grey-blue.png'); $this->image = new Image($this->imagePath); - $this->testImageSaveLocation = dirname(__FILE__).'/testImage.png'; - $this->compareTestSaveLocation = dirname(__FILE__).'/compareImage.png'; + $this->testImageSaveLocation = \dirname(__FILE__) . '/testImage.png'; + $this->compareTestSaveLocation = \dirname(__FILE__) . '/compareImage.png'; } public function tearDown(): void { - @unlink($this->testImageSaveLocation); - @unlink($this->compareTestSaveLocation); + @\unlink($this->testImageSaveLocation); + @\unlink($this->compareTestSaveLocation); } /** * Must test that the outputted PNG is the same because you can not compare resources. */ - public function test_it_loads_an_image_string_into_a_resource() + public function test_it_loads_an_image_string_into_a_resource(): void { - imagepng(imagecreatefromstring($this->imagePath), $this->compareTestSaveLocation); - imagepng($this->image->getImageResource(), $this->testImageSaveLocation); + \imagepng(imagecreatefromstring($this->imagePath), $this->compareTestSaveLocation); + \imagepng($this->image->getImageResource(), $this->testImageSaveLocation); - $correctImage = file_get_contents($this->compareTestSaveLocation); - $testImage = file_get_contents($this->testImageSaveLocation); + $correctImage = \file_get_contents($this->compareTestSaveLocation); + $testImage = \file_get_contents($this->testImageSaveLocation); $this->assertEquals($correctImage, $testImage); } - public function test_it_gets_the_correct_height() + public function test_it_gets_the_correct_height(): void { $correctHeight = 512; @@ -71,7 +71,7 @@ public function test_it_gets_the_correct_height() $this->assertEquals($correctHeight, $testHeight); } - public function test_it_gets_the_correct_width() + public function test_it_gets_the_correct_width(): void { $correctWidth = 512; From 20f2befbc1289e9d8bd4ca48e95a47b6dbaf3d5f Mon Sep 17 00:00:00 2001 From: Abdul Rahmad Pasaribu Date: Fri, 17 Jan 2025 11:43:28 +0700 Subject: [PATCH 5/6] chore: remove unnecessary files --- .github/stale.yml | 16 - .github/workflows/php.yml | 24 - CHANGELOG.md | 69 --- CONTRIBUTING.md | 3 - SECURITY.md | 14 - docs/ar/README.md | 539 -------------------- docs/de/README.md | 431 ---------------- docs/en/README.md | 428 ---------------- docs/es/README.md | 341 ------------- docs/fr/README.md | 340 ------------ docs/hi/README.md | 340 ------------ docs/imgs/200-pixels.png | Bin 1524 -> 0 bytes docs/imgs/250-pixels.png | Bin 1721 -> 0 bytes docs/imgs/circle-eye.png | Bin 2203 -> 0 bytes docs/imgs/diagonal.png | Bin 6519 -> 0 bytes docs/imgs/dot.png | Bin 5459 -> 0 bytes docs/imgs/example-1.png | Bin 8269 -> 0 bytes docs/imgs/example-2.png | Bin 24639 -> 0 bytes docs/imgs/eye-0.png | Bin 1434 -> 0 bytes docs/imgs/eye-1.png | Bin 1415 -> 0 bytes docs/imgs/eye-2.png | Bin 1434 -> 0 bytes docs/imgs/horizontal.png | Bin 3767 -> 0 bytes docs/imgs/inverse_diagonal.png | Bin 7432 -> 0 bytes docs/imgs/make-me-into-a-qrcode.png | Bin 2197 -> 0 bytes docs/imgs/merged-qrcode.png | Bin 11462 -> 0 bytes docs/imgs/radial.png | Bin 9498 -> 0 bytes docs/imgs/red-25-transparent-background.png | Bin 1549 -> 0 bytes docs/imgs/red-25-transparent.png | Bin 1218 -> 0 bytes docs/imgs/red-background.png | Bin 1375 -> 0 bytes docs/imgs/red-qrcode.png | Bin 1327 -> 0 bytes docs/imgs/round.png | Bin 3451 -> 0 bytes docs/imgs/vertical.png | Bin 4605 -> 0 bytes docs/it/README.md | 342 ------------- docs/ja/README.md | 436 ---------------- docs/kr/README.md | 358 ------------- docs/pt-br/README.md | 341 ------------- docs/ru/README.md | 438 ---------------- docs/zh-cn/README.md | 405 --------------- 38 files changed, 4865 deletions(-) delete mode 100644 .github/stale.yml delete mode 100644 .github/workflows/php.yml delete mode 100644 CHANGELOG.md delete mode 100644 CONTRIBUTING.md delete mode 100644 SECURITY.md delete mode 100644 docs/ar/README.md delete mode 100644 docs/de/README.md delete mode 100644 docs/en/README.md delete mode 100644 docs/es/README.md delete mode 100644 docs/fr/README.md delete mode 100644 docs/hi/README.md delete mode 100644 docs/imgs/200-pixels.png delete mode 100644 docs/imgs/250-pixels.png delete mode 100644 docs/imgs/circle-eye.png delete mode 100644 docs/imgs/diagonal.png delete mode 100644 docs/imgs/dot.png delete mode 100644 docs/imgs/example-1.png delete mode 100644 docs/imgs/example-2.png delete mode 100644 docs/imgs/eye-0.png delete mode 100644 docs/imgs/eye-1.png delete mode 100644 docs/imgs/eye-2.png delete mode 100644 docs/imgs/horizontal.png delete mode 100644 docs/imgs/inverse_diagonal.png delete mode 100644 docs/imgs/make-me-into-a-qrcode.png delete mode 100644 docs/imgs/merged-qrcode.png delete mode 100644 docs/imgs/radial.png delete mode 100644 docs/imgs/red-25-transparent-background.png delete mode 100644 docs/imgs/red-25-transparent.png delete mode 100644 docs/imgs/red-background.png delete mode 100644 docs/imgs/red-qrcode.png delete mode 100644 docs/imgs/round.png delete mode 100644 docs/imgs/vertical.png delete mode 100644 docs/it/README.md delete mode 100644 docs/ja/README.md delete mode 100644 docs/kr/README.md delete mode 100644 docs/pt-br/README.md delete mode 100644 docs/ru/README.md delete mode 100644 docs/zh-cn/README.md diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index 23826dd..0000000 --- a/.github/stale.yml +++ /dev/null @@ -1,16 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 90 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - bug -# Label to use when marking an issue as stale -staleLabel: stale -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: true diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml deleted file mode 100644 index edfb81e..0000000 --- a/.github/workflows/php.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Unit Tests - -on: - push: - branches: [ master, develop ] - pull_request: - branches: [ master, develop ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - - name: Validate composer.json and composer.lock - run: composer validate - - - name: Install dependencies - run: composer install --prefer-dist --no-progress - - - name: Run test suite - run: composer run-script test diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 9a5ed9f..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,69 +0,0 @@ -Simple QrCode -============= - -##Change Log - -#### 2.0.0 -* Fixed a bug where the merge image was not reset correctly. (#93) -* Added Laravel auto discovery support. (#82) - Thanks [mazedlx](https://github.com/mazedlx) - -#### 1.5.1 -* Fixed a bug where a QrCode used within a loop would not generate correctly. - -#### 1.5.0 -* Added Portuguese translation. -Thanks [francisek](https://github.com/francisek) and [Varpie!](https://github.com/Varpie) -* Added BitCoin helper - -#### 1.4.6 -* Added Portuguese translation. -Thanks [felipewmartins!](https://github.com/felipewmartins) - -#### 1.4.5 -* Added Spanish translation. -Thanks [gtarraga!](https://github.com/gtarraga) -* Added Hindi translation. -Thanks [himanshu81494!](https://github.com/himanshu81494) - -#### 1.4.4 -* Added Italian translation. -Thanks [simocosimo!](https://github.com/simocosimo) - -#### 1.4.3 -* Updated the docs to our new format. -* Correct some typos in the Russian translation. - -#### 1.4.2 -* Added Russian translation. -Thanks Victoria! -* Added Chinese translation. -Thanks [blusewang!](https://github.com/blusewang) - -#### 1.4.1 -* Improved the quality of QrCodes with logos merge on them. -Thanks [tuupke!](https://github.com/tuupke) - -#### 1.4.0 -* Added the `mergeString` method. This method adds the ability to pass in a binary string to create a QrCode with an image on it. -Thanks [tuupke!](https://github.com/tuupke) - -#### 1.3.3 -* Allow absolute paths to be used with the `merge` method. - -#### 1.3.2 -* Changed `bindShared` to `singleton` to support Laravel 5.2 -Thanks [lhdev!](https://github.com/lhdev) - -#### 1.3.1 -* Fixed a bug where `merge` did not work as expected when used with `size.` - -#### 1.3.0 -* Added `merge` method. -* Fixed a typo in the readme. - -#### 1.2.0 -* Added full support for Laravel 5 -* Added the following helpers. - * E-Mail - * Geo - * Phone Number - * SMS - * WiFi - -#### 1.1.1 -* Update dependencies. -* Corrected some composer file issues. -* Added some missing Laravel information to the QrCode Service Provider. - -####1.1.0 -* Added the ability to change the character encoding. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index 00ea4ff..0000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,3 +0,0 @@ -# Contribution Guidelines - -Please submit all issues and pull requests to the [simplesoftwareio/simple-qrcode](https://github.com/simplesoftwareio/simple-qrcode) repository on the develop branch! \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index 2a3758d..0000000 --- a/SECURITY.md +++ /dev/null @@ -1,14 +0,0 @@ -# Security Policy - -## Supported Versions - -| Version | Supported | -| ------- | ------------------ | -| >= 2.x | :white_check_mark: | -| <= 1.x | :x: | - -## Reporting a Vulnerability - -Please report security vulnerabilities responsibility by emailing `security@simplesoftware.io.` - -We will fix the vulnerability privately, push a new release, and then go public with the notification. diff --git a/docs/ar/README.md b/docs/ar/README.md deleted file mode 100644 index 0b65c9e..0000000 --- a/docs/ar/README.md +++ /dev/null @@ -1,539 +0,0 @@ - -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - -#### [Deutsch](http://www.simplesoftware.io/#/docs/simple-qrcode/de) | [Español](http://www.simplesoftware.io/#/docs/simple-qrcode/es) | [Français](http://www.simplesoftware.io/#/docs/simple-qrcode/fr) | [Italiano](http://www.simplesoftware.io/#/docs/simple-qrcode/it) | [Português](http://www.simplesoftware.io/#/docs/simple-qrcode/pt-br) | [Русский](http://www.simplesoftware.io/#/docs/simple-qrcode/ru) | [日本語](http://www.simplesoftware.io/#/docs/simple-qrcode/ja) | [한국어](http://www.simplesoftware.io/#/docs/simple-qrcode/kr) | [हिंदी](http://www.simplesoftware.io/#/docs/simple-qrcode/hi) | [简体中文](http://www.simplesoftware.io/#/docs/simple-qrcode/zh-cn) | [العربية](https://www.simplesoftware.io/#/docs/simple-qrcode/ar) - -
- - -## المقدمة -Simple QrCode هو غلاف سهل الاستخدام لإطار عمل Laravel الشهير استنادًا إلى العمل الرائع الذي يقدمه [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). أنشأنا واجهة مألوفة و سهلة التثبيت لمستخدمي لارافل - -![المثال 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-1.png?raw=true) ![المثال 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-2.png?raw=true) - - -## دليل الترقية - -قم بالترقية من V2 أو V3 عن طريق ملف `composer.json` إلى `~4` - -يجب تثبيت امتداد PHP الخاص بـ `imagick` إذا كنت تخطط لاستخدام تنسيق صورة` png`. - - -#### v4 - -> كان هناك خطأ عند إنشاء 4.1.0 و السماح ل للتغيرات التي حدثت للفرع الرئيسي. دالة `generate` الآن ترجع حالة `Illluminate\Support\HtmlString` إذا كنت تستخدم لارافل. -> إطلع على https://github.com/SimpleSoftwareIO/simple-qrcode/issues/205 لمزيد من التفاصيل - - -كانت هنا مشكلة مع واجهة لارافل في الإصدار ال3 التي أحدثت بعض المشاكل في التحميل. الطريقة الوحيدة لإصلاح هذا هو الإعتماد على الإصدار الرابع من الحزمة. إذا أنت من الإصدار V2 لا يوجد اي حاجة لتغيير الكود. التغييرات الآتية فقط تشمل الإصدار الثالث V3 - -جميع الإشارات لواجهة `QrCode` تحتاج لتغيير الآتي: -
- -``` -use SimpleSoftwareIO\QrCode\Facades\QrCode; -``` - - -
-## الإعدادات - -#### Composer - -قم بتشغيل `composer require simplesoftwareio/simple-qrcode "~4"` لإضافة الحزمة. - -لارافل ستقوم تلقائيا بتنصيب الحزمة. - - -## أفكار بسيطة - -#### عرض الطباعة - -واحدة من العناصر التي تستخدم هذه الحزمة لأجل الحصول على QrCodes في كل عروض الطباعة. هذه الخاصية تسمح للمستخدم للرجوع إلى الصفحة الأصلية بعد أن تمت طباعة الكود. -حصلنا على هذه النتيجة عن طريق إضافة التالي لتذييل الصفحة footer.blade.php -
- -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

Scan me to return to the original page.

-
- -
-#### تضمين QrCode - -ممكن ان تضمن الqrcode داخل بريد إلكتروني للسماح لمستخدميك بعمل مسح سريع على qrcode. -التالي هو مثال لكيفية عمل هذا بإستخدام إطار العمل لارافل. - -
- - //Inside of a blade template. - - -
- -## الإستخدامات - -#### الإستخدامات البسيطة - -
- -``` -// جميع الأمثلة التالية تفترض أن واجهة Qrcode تم إستدعائها. -// واجهة Qrcode يتم إستدعائها تلقائيا بالنسبة لمستخدمي لارافل - -use SimpleSoftwareIO\QrCode\Facades\QrCode; -``` -
- -يعد استخدام QrCode Generator أمرًا سهلاً للغاية. أبسط شكل للكود هو: - -
- - use SimpleSoftwareIO\QrCode\Facades\QrCode; - - QrCode::generate('Make me into a QrCode!'); - -
- -هذا سيحول الكود إلى QrCode يحمل العبارة التالية: "Make me into a QrCode!" - -![Example QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/make-me-into-a-qrcode.png?raw=true) - -#### Generate `(string $data, string $filename = null)` - -`Generate` تستخدم لإنشاء QrCode - -
- - QrCode::generate('Make me into a QrCode!'); - -
- -`Generate` بشكل افتراضي سيعيد سلسلة صورة SVG. يمكنك طباعة هذا مباشرة في متصفح حديث داخل نظام Laravel's Blade باستخدام ما يلي: - -
- - {!! QrCode::generate('Make me into a QrCode!'); !!} - -
- -طريقة "generate" لها معلمة ثانية ستقبل اسم ملف ومسار لحفظ رمز الاستجابة السريعة. - -
- - QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); - -
- -#### شكل `(string $format)` - -ثلاثة تنسيقات مدعومة حاليا ؛ `png`, `eps`, و `svg` . لتغيير التنسيق استخدم الكود التالي: - -
- - QrCode::format('png'); //Will return a png image - QrCode::format('eps'); //Will return a eps image - QrCode::format('svg'); //Will return a svg image - -
- -> `imagick` مطلوبة لإنشاء إمتداد `png` - -#### Size `(int $size)` - -يمكنك تغيير حجم رمز الاستجابة السريعة باستخدام طريقة`size`. ما عليك سوى تحديد الحجم المطلوب بالبكسل باستخدام الصيغة التالية: - -
- - QrCode::size(100); - -
- -![200 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) ![250 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/250-pixels.png?raw=true) - -#### Color `(int $red, int $green, int $blue, int $alpha = null)` - ->كن حذرًا عند تغيير لون رمز QrCode ، حيث يواجه بعض القراء صعوبة بالغة في قراءة رموز QrCode بالألوان. - -يجب التعبير عن كل الألوان في RGBA (أحمر أخضر أزرق ألفا). يمكنك تغيير لون رمز الاستجابة السريعة باستخدام ما يلي: - -
- - QrCode::color(255, 0, 0); // Red QrCode - QrCode::color(255, 0, 0, 25); //Red QrCode with 25% transparency - -
- -![Red QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-qrcode.png?raw=true) ![Red Transparent QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent.png?raw=true) - -#### Background Color `(int $red, int $green, int $blue, int $alpha = null)` - -يمكنك تغيير لون خلفية رمز QrCode عن طريق استدعاء دالة `backgroundColor`. - -
- - QrCode::backgroundColor(255, 0, 0); // Red background QrCode - QrCode::backgroundColor(255, 0, 0, 25); //Red background QrCode with 25% transparency - -
- -![Red Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-background.png?raw=true) ![Red Transparent Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent-background.png?raw=true) - -#### Gradient `$startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type)` - -يمكنك تطبيق التدرج اللوني في الQrcode عن طريق إستدعاء الدالة `gradient` - -يتم دعم أنواع التدرجات اللونية التالية: - -| النوع | مثال | -| --- | --- | -| `vertical` | ![Veritcal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/vertical.png?raw=true) | -| `horizontal` | ![Horizontal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/horizontal.png?raw=true) | -| `diagonal` | ![Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/diagonal.png?raw=true) | -| `inverse_diagonal` | ![Invrse Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/inverse_diagonal.png?raw=true) | -| `radial` | ![Radial](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/radial.png?raw=true) | - -#### EyeColor `(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0)` - -ربما تريد تغيير لون العين بإستخدم دالة `eyeColor`. - -
- - QrCode::eyeColor(0, 255, 255, 255, 0, 0, 0); // Changes the eye color of eye `0` - -
- -| رقم العين | مثال | -| --- | --- | -| `0` | ![Eye 0](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-0.png?raw=true) | -| `1` | ![Eye 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-1.png?raw=true)| -| `2` | ![Eye 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-2.png?raw=true) | - - -#### Style `(string $style, float $size = 0.5)` - - -يمكن تبديل النمط بسهولة بـ`square` أو `dot` أو`round`. سيؤدي هذا إلى تغيير الكتل داخل -سيأثر المعامل الثاني للدالة على الحجم الخاص بالنقاط و الإستدارة - - -التنسيق - -
- - QrCode::style('dot'); // Uses the `dot` style. - -
- -| التنسيق | مثال | -| --- | --- | -| `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `dot` | ![Dot](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/dot.png)| -| `round` | ![Round](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/round.png?raw=true) | - -#### Eye Style `(string $style)` - -العين التي بداخل الQrcode تدعم طريقتين مختلفيتين في التنسيق `square` و `circle` - - QrCode::eye('circle'); // Uses the `circle` style eye. - -| Style | Example | -| --- | --- | -| `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `circle` | ![Circle](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/circle-eye.png?raw=true)| - -#### Margin `(int $margin)` - -القدرة على تغيير الهامش حول QrCode مدعومة أيضًا. ما عليك سوى تحديد الهامش المطلوب باستخدام الصيغة التالية: - -
- - QrCode::margin(100); - -
- -#### Error Correction `(string $errorCorrection)` - -من السهل تغيير مستوى تصحيح الخطأ. فقط استخدم الصيغة التالية: - -
- - QrCode::errorCorrection('H'); - -
- -الخيارات التالية تم دعمها في دالة `errorCorrection`: - -| تصحيح الخطأ | الضمان المتوفر | -| --- | --- | -| L | 7% يمكن استعادة الكلمات المشفرة. | -| M | 15% يمكن استعادة الكلمات المشفرة. | -| Q | 25% يمكن استعادة الكلمات المشفرة. | -| H | 30% يمكن استعادة الكلمات المشفرة. | - -> كلما إستخدمت نسبة تصحيح الخطأ أكثر, لكما قلت مصداقية ال Qrcode في إسترجاع البيانات المسجلة داخله -> إطلع أكثر حول [تصحيح الخطأ](https://ar.wikipedia.org/wiki/%D8%B1%D9%85%D8%B2_%D8%A7%D8%B3%D8%AA%D8%AC%D8%A7%D8%A8%D8%A9_%D8%B3%D8%B1%D9%8A%D8%B9%D8%A9#Error_correction). - - -#### Encoding `(string $encoding)` - -قم بتغيير ترميز الأحرف المستخدم لبناء QrCode. افتراضيًا ، يتم تحديد "ISO-8859-1" باعتباره المشفر. اقرأ المزيد عن [ترميز الحروف](http://en.wikipedia.org/wiki/Character_encoding). - -يمكنك تغيير هذا إلى أي مما يلي: - -
- - QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); - -
- -| تشفير الأحرف | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - -#### Merge `(string $filepath, float $percentage = .2, bool $absolute = false)` - -تدمج دالة `merge` صورة عبر QrCode. يستخدم هذا بشكل شائع لوضع الشعارات داخل QrCode. - -
- - //Generates a QrCode with an image centered in the middle. - QrCode::format('png')->merge('path-to-image.png')->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->merge('path-to-image.png', .3)->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); - -
- -> دالة "merge" تدعم PNG فقط في الوقت الحالي. -> يعد مسار الملف نسبيًا لمسار التطبيق الأساسي إذا تم تعيين`$absolute` على `false`. غيّر هذا المتغير إلى `true` لاستخدام المسارات المطلقة. - -> يجب عليك استعمال نسبة الإرتفاع ل تصحيح الخطأ عندما تستعمل دالة `merge` للتأكد أن ال Qrcode باقي سهل القراءة. نوصي باستخدام `errorCorrection('H')`. - -![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### Merge Binary String `(string $content, float $percentage = .2)` - -دالة `mergeString` يمكن إستخدامها للوصول لنفس النتيجة عندما تستدعي دالة `merge`, باستثناء أنه يسمح لك بتوفير تمثيل سلسلة للملف بدلاً من مسار الملف. هذا مفيد عند العمل مع واجهة `Storage`. واجهته مشابهة تمامًا لدالة `merge` - -
- - //Generates a QrCode with an image centered in the middle. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); - -
->كما هو الحال مع استدعاء `merge` العادي ، يتم دعم PNG فقط في الوقت الحالي. الأمر نفسه ينطبق على تصحيح الخطأ ، ويوصى بالمستويات العالية. - -#### إستعمالات متقدمة - -جميع الدوال تدعم التسلسل. يجب إستدعاء دالة `generate` في الأخير. على سبيل المثال: - -
- - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); - -
- -تستطيع عرض صورة بإمتداد PNG بدون حفظ الملف من خلال توفير سلسلة raw string و encoding بواسطة `base64_encode`. - -
- - - -
- - -## الدوال المساعدة - -#### ماهي الدوال المساعدة - -تعد الدوال المساعدة طريقة سهلة لإنشاء QrCodes التي تجعل القارئ يقوم بعمل معين عند مسحه ضوئيا - -#### بيتكوين - -This helper generates a scannable bitcoin to send payments. [More information](https://bitco.in/en/developer-guide#plain-text) - -هاته الدالة المساعدة تقوم بعمل إنشاء عملة بيتكوين قابلة للمسح لإرسال مدفوعات. [لمزيد من المعلومات أضغط على الرابط](https://bitco.in/en/developer-guide#plain-text) - -
- - QrCode::BTC($address, $amount); - - //Sends a 0.334BTC payment to the address - QrCode::BTC('bitcoin address', 0.334); - - //Sends a 0.334BTC payment to the address with some optional arguments - QrCode::size(500)->BTC('address', 0.0034, [ - 'label' => 'my label', - 'message' => 'my message', - 'returnAddress' => 'https://www.returnaddress.com' - ]); - -
- -#### البريد الإلكتروني - -هاته الدالة المساعدة تمكنك من إنشاء QrCode للبريد الإلكتروني عنوان بريد إلكتروني مع الموضوع و المحتوى - -
- - QrCode::email($to, $subject, $body); - - //Fills in the to address - QrCode::email('foo@bar.com'); - - //Fills in the to address, subject, and body of an e-mail. - QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); - - //Fills in just the subject and body of an e-mail. - QrCode::email(null, 'This is the subject.', 'This is the message body.'); - -
- -#### الموقع الجغرافي - -هاته الدالة المساعة تنشأ لك خطوط طول و عرض لتتم القرائة عن طريق الهاتف و فتح الموقع على خرائط Google أو تطبيق مشابه - -
- - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -
- -#### رقم الهاتف - -هاته الدالة تمكنك من إنشاء QrCode يستطيع الهاتف مسحه و الإتصال بالرقم. - -
- - QrCode::phoneNumber($phoneNumber); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -
- -#### الرسائل القصيرة (الرسائل النصية) - -هاته الدالة المساعدة تمكنك من إنشاء رسالة نصية و التي يمكن تعبئتها مسبقًا بالإرسال إلى العنوان ونص الرسالة: - -
- - QrCode::SMS($phoneNumber, $message); - - //Creates a text message with the number filled in. - QrCode::SMS('555-555-5555'); - - //Creates a text message with the number and message filled in. - QrCode::SMS('555-555-5555', 'Body of the message'); - -
- -#### الوايفاي - -هاته الدالة المساعدة تمكنك من مسح ال QrCodes التي بدورها تعمل إتصال من الهاتف لشبكة الوايفاي: - -
- - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID of the network', - 'password' => 'Password of the network', - 'hidden' => 'Whether the network is a hidden SSID or not.' - ]); - - //Connects to an open WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - ]); - - //Connects to an open, hidden WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'hidden' => 'true' - ]); - - //Connects to a secured WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'encryption' => 'WPA', - 'password' => 'myPassword' - ]); - -
- -> منتجات أبل في الوقت الحالي لا تدعم مسح الوايفاي عن طريق ال QrCode - - -## الإستعمالات الشائعة لل QrCode - - -يمكنك استخدام بادئة موجودة في الجدول أدناه داخل قسم `generate` لإنشاء رمز QrCode لتخزين المزيد من المعلومات المتقدمة: - -
- - QrCode::generate('http://www.simplesoftware.io'); - -
- -| الإستعمال | الإختصار | مثال | -| --- | --- | --- | -| رابط موقع إلكتروني | http:// | http://www.simplesoftware.io | -| عنوان URL آخمن | https:// | https://www.simplesoftware.io | -| بريد إلكتروني | mailto: | mailto:support@simplesoftware.io | -| رقم هاتف | tel: | tel:555-555-5555 | -| رسالة نصية (SMS) | sms: | sms:555-555-5555 | -| رسالة نصية (SMS) مع رسالة مكتوبة مسبقًا | sms: | sms::I am a pretyped message | -| رسالة نصية (SMS) مع رسالة ورقم مكتوب مسبقًا | sms: | sms:555-555-5555:I am a pretyped message | -| العنوان الجغرافي | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | -| الوايفاي | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -## إستخدام خارج لارافل - -يمكنك إستخدام هاته الحزمة خارج إطار لارافل عبر إنشاء `Generator` كلاس Class جديد: - -
- - use SimpleSoftwareIO\QrCode\Generator; - - $qrcode = new Generator; - $qrcode->size(500)->generate('Make a qrcode without Laravel!'); - -
\ No newline at end of file diff --git a/docs/de/README.md b/docs/de/README.md deleted file mode 100644 index 0a76aa1..0000000 --- a/docs/de/README.md +++ /dev/null @@ -1,431 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - -#### [Deutsch](http://www.simplesoftware.io/#/docs/simple-qrcode/de) | [Español](http://www.simplesoftware.io/#/docs/simple-qrcode/es) | [Français](http://www.simplesoftware.io/#/docs/simple-qrcode/fr) | [Italiano](http://www.simplesoftware.io/#/docs/simple-qrcode/it) | [Português](http://www.simplesoftware.io/#/docs/simple-qrcode/pt-br) | [Русский](http://www.simplesoftware.io/#/docs/simple-qrcode/ru) | [日本語](http://www.simplesoftware.io/#/docs/simple-qrcode/ja) | [한국어](http://www.simplesoftware.io/#/docs/simple-qrcode/kr) | [हिंदी](http://www.simplesoftware.io/#/docs/simple-qrcode/hi) | [简体中文](http://www.simplesoftware.io/#/docs/simple-qrcode/zh-cn) - -- [Einführung](#docs-introduction) -- [Upgrade-Anleitung](#docs-upgrade) -- [Installation](#docs-configuration) -- [Einfache Anwendungsideen](#docs-ideas) -- [Nutzungsbeispiele](#docs-usage) -- [Helfer](#docs-helpers) -- [Häufig verwendete QrCodes](#docs-common-usage) -- [Verwendung außerhalb von Laravel](#docs-outside-laravel) - -### Testen Sie unseren kinderleichten, kostenlosen Dateiübertragungs-Service [keep.sh](https://keep.sh) - -[![keep.sh](https://user-images.githubusercontent.com/624784/95805291-1121e980-0cd3-11eb-9048-0264bd9f2fd7.gif)](https://keep.sh) - -Einfaches und schnelles Teilen von Dateien direkt aus der Kommandokonsole über einen einzigen curl Aufruf! `curl --upload-file deine-lokale-datei.txt https://keep.sh` - - -## Einführung -Simple QrCode stellt eine komfortable Schnittstelle zum Generieren von QrCodes für das beliebte Laravel Framework dar und basiert auf der großartigen Arbeit von [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Das Paket ist einfach zu installieren und bietet ein Laravel-Nutzern vertrautes Nutzererlebnis. - -![Example 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-1.png?raw=true) ![Example 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-2.png?raw=true) - - -## Upgrade-Anleitung - -Um von v2 auf v3 zu aktualisieren, muss die Versionsangabe der `simplesoftwareio/simple-qrcode` Abhängigkeit in der `composer.json` Datei auf `~4` geändert werden: - - "require": { - "simplesoftwareio/simple-qrcode": "~4" - } - -Ein abschließender Aufruf von `composer update simplesoftwareio/simple-qrcode` aktualisiert das installierte Paket. - ->Um das `png` Bildformat zu verwenden, **muss zwingend** die `imagick` PHP Extension installiert werden. - -#### v4 - -> In Version 4.1.0 hat sich ein Breaking Change eingeschlichen, der die Abwärtskompatibilität beeinträchtigt. Die `generate` Methode liefert in Laravel statt eines Strings nun eine `Illuminate\Support\HtmlString` Instanz zurück. Weitere Informationen dazu unter https://github.com/SimpleSoftwareIO/simple-qrcode/issues/205. - -Es gab einen Fehler im Bereich der Laravel Facades von v3, der einige Probleme beim Laden verursachte. Da die Problembehebung eine nicht abwärtskompatible Änderung nötig gemacht hat, wurde v4 veröffentlicht. Bei einem Upgrade von v2 muss kein Code angepasst werden; die nachfolgende Änderung betrifft nur Nutzer der v3. - -Sämtliche Verweise auf die `QrCode` Facade müssen wie folgt geändert werden: - -``` -use SimpleSoftwareIO\QrCode\Facades\QrCode; -``` - - -## Installation - -#### Composer - -Das Paket kann durch Ausführung von `composer require simplesoftwareio/simple-qrcode "~4"` installiert werden. - -Laravel wird das Paket automatisch integrieren. - - -## Einfache Anwendungsideen - -#### Druckansicht - -Wir verwenden das Package hauptsächlich dazu, QrCodes auf all unseren Druckansichten zu platzieren. So können unsere Kunden durch einfaches Scannen des QrCodes auf der ausgedruckten Seite zur Ursprungsseite zurückfinden. Erreicht haben wir das durch ein Hinzufügen der folgenden Zeilen in unserer footer.blade.php Datei: - -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

Scan mich, um zur Original-Seite zurückzukehren.

-
- -#### Einbetten eines QrCodes - -Ein QrCode kann in eine E-Mail eingebettet werden, um den Nutzern ein schnelles Scannen zu ermöglichen. Das folgende Beispiel zeigt, wie man dies mit Laravel umsetzt: - - // Innerhalb eines Blade Templates. - - - -## Nutzungsbeispiele - -#### Grundfunktionen - -``` -// Alle Beispiele gehen davon aus, dass die QrCode Facade über die untenstehende Code-Zeile eingebunden wird. Für Laravel Benutzer wird die Facade automatisch geladen. - -use SimpleSoftwareIO\QrCode\Facades\QrCode; -``` - -Die Verwendung des QrCode Generators ist sehr einfach. Die einfachste Art der Nutzung ist: - - use SimpleSoftwareIO\QrCode\Facades\QrCode; - - QrCode::generate('Wandel mich in einen QrCode!'); - -Dies wird einen QrCode mit dem Inhalt "Wandel mich in einen QrCode!" generieren. - -#### Generate `(string $data, string $filename = null)` - -`Generate` wird genutzt, um den QrCode zu generieren. - - QrCode::generate('Wandel mich in einen QrCode!'); - -Standardmäßig liefert `generate` einen String mit SVG Daten zurück. Über Laravels Blade Template System kann dieser direkt in modernen Browsern angezeigt werden: - - {!! QrCode::generate('Wandel mich in einen QrCode!'); !!} - -Die `generate` Methode akzeptiert als zweiten Parameter einen Dateipfad zum Speichern des QrCodes in einer Zieldatei: - - QrCode::generate('Wandel mich in einen QrCode!', '../public/qrcodes/qrcode.svg'); - -#### Format `(string $format)` - -Es werden derzeit drei Bildformate unterstützt: `png`, `eps` und `svg`. Das gewünschte Format kann wie folgt gewählt werden: - - QrCode::format('png'); // Wird ein png zurückliefern - QrCode::format('eps'); // Wird ein eps zurückliefern - QrCode::format('svg'); // Wird ein svg zurückliefern - -> `imagick` wird benötigt, um ein `png` zu generieren. - -#### Size `(int $size)` - -Die gewünschte Größe des QrCodes kann über die `size` Methode festgelegt werden. Dazu wird einfach die gewünschte Größe in Pixel übergeben: - - QrCode::size(100); - -![200 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) ![250 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/250-pixels.png?raw=true) - -#### Color `(int $red, int $green, int $blue, int $alpha = null)` - ->Vorsicht beim Ändern der Farbe eines QrCodes: einige QrCode-Leser haben große Schwierigkeiten, farbige QrCodes zu lesen. - -Alle Farben werden im RGBA (Rot, Grün, Blau, Alpha) Format angegeben. Die Farbe eines QrCodes kann wie folgt geändert werden: - - QrCode::color(255, 0, 0); // Roter QrCode - QrCode::color(255, 0, 0, 25); // Roter QrCode mit 25% Transparenz - -![Red QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-qrcode.png?raw=true) ![Red Transparent QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent.png?raw=true) - -#### Background Color `(int $red, int $green, int $blue, int $alpha = null)` - -Die Hintergrundfarbe eines QrCodes kann über die `backgroundColor` Methode geändert werden. - - QrCode::backgroundColor(255, 0, 0); // QrCode mit rotem Hintergrund - QrCode::backgroundColor(255, 0, 0, 25); // QrCode mit rotem Hintergrund und 25% Transparenz - -![Red Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-background.png?raw=true) ![Red Transparent Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent-background.png?raw=true) - -#### Gradient `$startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type)` - -Einem QrCode kann über die `gradient` Methode ein Farbverlauf zugewiesen werden. - -Die folgenden Typen von Gradienten werden unterstützt: - -| Typ | Beispiel | -| --- | --- | -| `vertical` | ![Veritcal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/vertical.png?raw=true) | -| `horizontal` | ![Horizontal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/horizontal.png?raw=true) | -| `diagonal` | ![Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/diagonal.png?raw=true) | -| `inverse_diagonal` | ![Invrse Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/inverse_diagonal.png?raw=true) | -| `radial` | ![Radial](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/radial.png?raw=true) | - -#### EyeColor `(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0)` - -Die Farben der Positionsmarker können über die `eyeColor` Methode angepasst werden. - - QrCode::eyeColor(0, 255, 255, 255, 0, 0, 0); // Ändert die Farbe des Positionsmarkers `0` - -| Auge Nr. | Beispiel | -| --- | --- | -| `0` | ![Eye 0](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-0.png?raw=true) | -| `1` | ![Eye 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-1.png?raw=true)| -| `2` | ![Eye 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-2.png?raw=true) | - - -#### Style `(string $style, float $size = 0.5)` - -Über `square` (quadratisch), `dot` (punktförmig), oder `round` (rund) kann der Stil einfach ausgetauscht werden. Dies ändert die Datenblöcke innerhalb des QrCodes. Der zweite Parameter bestimmt die Größe der einzelnen Punkte oder deren Abrundung. - - QrCode::style('dot'); // Ändert den Stil auf `dot`. - -| Stil | Beispiel | -| --- | --- | -| `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `dot` | ![Dot](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/dot.png)| -| `round` | ![Round](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/round.png?raw=true) | - -#### Eye Style `(string $style)` - -Es werden zwei verschiedene Stile von Positionsmarkern unterstützt: `square` (quadratisch) und `circle` (rund). - - QrCode::eye('circle'); // Verwendet den runden `circle` Stil. - -| Style | Example | -| --- | --- | -| `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `circle` | ![Circle](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/circle-eye.png?raw=true)| - -#### Margin `(int $margin)` - -Der Seitenrand des QrCodes kann über die folgende Syntax festgelegt werden: - - QrCode::margin(100); - -#### Error Correction `(string $errorCorrection)` - -Über die `errorCorrection` Methode kann der anzuwendende Grad der Fehlerkorrektur einfach geändert werden: - - QrCode::errorCorrection('H'); - -Die folgenden Optionen werden von der Methode unterstützt: - -| Fehlerkorrekturstufe | Gewährleistete Sicherheit | -| --- | --- | -| L | 7% der Daten können wiederhergestellt werden. | -| M | 15% der Daten können wiederhergestellt werden. | -| Q | 25% der Daten können wiederhergestellt werden. | -| H | 30% of der Daten können wiederhergestellt werden. | - ->Je hoher die Fehlerkorrekturstufe, desto größer wird der resultierende QrCode und desto weniger Daten können in ihm gespeichert werden. Mehr Informationen zur [Fehlerkorrektur](http://de.wikipedia.org/wiki/QR_code#Error_correction) finden sich in der Wikipedia. - -#### Encoding `(string $encoding)` - -Über die `encoding` Methode kann die für den QrCode verwendete Zeichenkodierung bestimmt werden. Standardmäßig wird `ISO-8859-1` verwendet. Mehr zur [Zeichenkodierung](https://de.wikipedia.org/wiki/Zeichenkodierung) findet sich in der Wikipedia. - -Die folgenden Kodierungen werden unterstützt: - - QrCode::encoding('UTF-8')->generate('Generier mir einen QrCode mit Symbolen ♠♥!!'); - -| Zeichenkodierung | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - -#### Merge `(string $filepath, float $percentage = .2, bool $absolute = false)` - -Die `merge` Methode passt ein Bild in einen QrCode ein. Üblicherweise wird dies verwendet, um ein Logo in einem QrCode anzuzeigen. - - // Generiert einen QrCode mit einem mittig zentrierten Bild. - QrCode::format('png')->merge('pfad-zur-bilddatei.png')->generate(); - - // Generiert einen QrCode mit einem mittig zentrierten Bild. Das Bild nimmt dabei 30% des QrCodes ein. - QrCode::format('png')->merge('pfad-zur-bilddatei.png', .3)->generate(); - - // Generiert einen QrCode mit einem mittig zentrierten Bild. Das Bild nimmt dabei 30% des QrCodes ein. - QrCode::format('png')->merge('http://www.google.com/irgendeinbild.png', .3, true)->generate(); - ->Die `merge` Methode unterstützt derzeit ausschließlich Bilder im PNG Format. ->Der Dateipfad muss relativ zum Basispfad der App angegeben werden, solange `$absolute` auf `false` gesetzt ist. Ein absoluter Dateipfad wird erwartet, wenn der Parameter auf `true` gesetzt wird. - ->Bei Verwendung der `merge` Methode sollte eine hohe Fehlerkorrekturstufe gewählt werden, um sicherzustellen, dass der QrCode lesbar bleibt. Wir empfehlen eine Nutzung von `errorCorrection('H')`. - -![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### Merge Binary String `(string $content, float $percentage = .2)` - -Die `mergeString` Methode entspricht der `merge` Methode, erlaubt aber abweichend den Inhalt einer Bilddatei als String zu übergeben. Dies ist besonders hilfreich, wenn mit der `Storage` Facade gearbeitet wird. - - // Generiert einen QrCode mit einem mittig zentrierten Bild. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); - - // Generiert einen QrCode mit einem mittig zentrierten Bild. Das Bild nimmt dabei 30% des QrCodes ein. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); - ->Wie auch bei `merge` werden derzeit nur Daten im PNG Format unterstützt. Ebenso wird auch hier die Verwendung einer hohen Fehlerkorrekturstufe empfohlen. - -#### Fortgeschrittene Nutzung - -Alle Methoden können verkettet werden. Dabei muss die `generate` Methode jeweils als letztes aufgerufen werden. So sind beispielsweise die folgenden Aufrufe möglich: - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Generier einen QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Generier einen QrCode!'); - -Durch Umwandlung der als String zurückgelieferten binären Bilddaten über `base64_encode` kann der QrCode als PNG Bild angezeigt werden, ohne dieses vorher in einer Datei speichern zu müssen: - - - - -## Helfer - -#### Was sind Helfer? - -Helfer stellen einen einfachen Weg war, QrCodes zu generieren, die einen QrCode-Leser anweisen, nach dem Scannen eine bestimmte Aktion auszuführen. - -#### BitCoin - -Dieser Helfer generiert einen QrCode, um BitCoin-Zahlungen anzuweisen. [Weitere Informationen](https://bitco.in/en/developer-guide#plain-text) dazu (in Englisch). - - QrCode::BTC($adresse, $betrag); - - // Weist eine Zahlung über 0.334BTC an die angegebene Adresse an. - QrCode::BTC('bitcoin adresse', 0.334); - - // Sendet eine Zahlung über 0.334BTC an die Adresse mit zusätzlichen optionalen Parametern. - QrCode::size(500)->BTC('adresse', 0.0034, [ - 'label' => 'Meine Kennzeichnung', - 'message' => 'Meine Nachricht', - 'returnAddress' => 'https://www.rueckkehrurl.com' - ]); - -#### E-Mail - -Dieser Helfer generiert einen E-Mail QrCode, der automatisch die Zieladresse, Betreff und einen Text im E-Mail-Programm befüllt: - - QrCode::email($an, $betreff, $nachricht); - - // Füllt die Zieladresse aus. - QrCode::email('foo@bar.com'); - - // Füllt die Zieladresse, das Betreff und die Nachricht einer E-Mail aus. - QrCode::email('foo@bar.com', 'Dies ist das Betreff.', 'Dies ist die Nachricht.'); - - // Füllt nur Betreff und Nachricht aus. - QrCode::email(null, ''Dies ist das Betreff.', 'Dies ist die Nachricht.'); - -#### Geo - -Dieser Helfer generiert einen QrCode mit Positionsinformationen über Angabe eines Breiten- und Längengrads, die ein Smartphone lesen und in Google Maps oder einer ähnlichen App darstellen kann. - - QrCode::geo($breitengrad, $laengengrad); - - QrCode::geo(37.822214, -122.481769); - -#### Telefonnummer - -Dieser Helfer generiert einen QrCode, der den QrCode-Leser anweist, eine Telefonnummer anzuwählen. - - QrCode::phoneNumber($telefonNummer); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### SMS Nachrichten - -Über diesen Helfer können Nachrichten in der SMS App vorab mit der Nummer und dem Text ausgefüllt werden: - - QrCode::SMS($telefonNummer, $nachricht); - - // Generiert eine leere SMS mit vorbefüllter Telefonnummer. - QrCode::SMS('555-555-5555'); - - // Generiert eine SMS mit vorbefüllter Telefonnummer und Nachricht. - QrCode::SMS('555-555-5555', 'Nachricht'); - -#### WiFi - -Dieser Helper generiert QrCodes, die gescannt werden können um ein Mobilgerät mit einem Drahtlosnetzwerk zu verbinden: - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID des Netzwerks', - 'password' => 'Passwort des Netzwerks', - 'hidden' => 'Bestimmt ob die SSID des Netzwerks versteckt ist oder nicht.' - ]); - - // Verbindet zu einem offenen Drahtlosnetzwerk. - QrCode::wiFi([ - 'ssid' => 'Netzwerkname', - ]); - - // Verbindet zu einem offenen Drahtlosnetzwerk mit geheimer SSID. - QrCode::wiFi([ - 'ssid' => 'Netzwerkname', - 'hidden' => 'true' - ]); - - // Verbindet zu einem gesicherten Drahtlosnetzwerk mit WPA Verschlüsselung. - QrCode::wiFi([ - 'ssid' => 'Nerzwerkname', - 'encryption' => 'WPA', - 'password' => 'Netzwerkpasswort' - ]); - ->WiFi QrCodes werden aktuell nicht von Apple-Produkten unterstützt. - - -## Häufig verwendete QrCodes - -Dem Inhaltsparameter der `generate` Methode kann ein Präfix vorangestellt werden, um auf schnelle Weise einen QrCode mit komplexeren Informationen zu generieren: - - QrCode::generate('http://www.simplesoftware.io'); - - -| Verwendung | Präfix | Beispiel | -| --- | --- | --- | -| Webseiten URL | http:// | http://www.simplesoftware.io | -| Sichere URL | https:// | https://www.simplesoftware.io | -| E-mail Adresse | mailto: | mailto:support@simplesoftware.io | -| Telefonnummer | tel: | tel:555-555-5555 | -| SMS | sms: | sms:555-555-5555 | -| SMS mit vorbefüllter Nachricht | sms: | sms::Ich bin eine vorbefüllte Nachricht | -| SMS mit vorbefüllter Nachricht und Nummer | sms: | sms:555-555-5555:Ich bin eine vorbefüllte Nachricht | -| Geo-Position | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Eine Adresse, Irgendwo, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [Beispiele auf Wikipedia](https://de.wikipedia.org/wiki/VCard) | -| Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Versteckt(True/False) | - - -## Verwendung außerhalb von Laravel - -Dieses Paket kann auch ohne Laravel verwendet werden, indem man eine neue Instanz der `Generator` Klasse erzeugt. - - use SimpleSoftwareIO\QrCode\Generator; - - $qrcode = new Generator; - $qrcode->size(500)->generate('Generiere einen QrCode ohne Laravel!'); diff --git a/docs/en/README.md b/docs/en/README.md deleted file mode 100644 index 4df2d3c..0000000 --- a/docs/en/README.md +++ /dev/null @@ -1,428 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - -#### [Deutsch](http://www.simplesoftware.io/#/docs/simple-qrcode/de) | [Español](http://www.simplesoftware.io/#/docs/simple-qrcode/es) | [Français](http://www.simplesoftware.io/#/docs/simple-qrcode/fr) | [Italiano](http://www.simplesoftware.io/#/docs/simple-qrcode/it) | [Português](http://www.simplesoftware.io/#/docs/simple-qrcode/pt-br) | [Русский](http://www.simplesoftware.io/#/docs/simple-qrcode/ru) | [日本語](http://www.simplesoftware.io/#/docs/simple-qrcode/ja) | [한국어](http://www.simplesoftware.io/#/docs/simple-qrcode/kr) | [हिंदी](http://www.simplesoftware.io/#/docs/simple-qrcode/hi) | [简体中文](http://www.simplesoftware.io/#/docs/simple-qrcode/zh-cn) - -## Try our dead simple, free file transfer service [keep.sh](https://keep.sh) - -[![keep.sh](https://user-images.githubusercontent.com/624784/95805291-1121e980-0cd3-11eb-9048-0264bd9f2fd7.gif)](https://keep.sh) - -Upload files with a single curl command from your terminal! `curl --upload-file file.txt https://keep.sh` - -## Use Cases -

- - - -

-

- Platform to sell tickets online -

- - -## Introduction -Simple QrCode is an easy to use wrapper for the popular Laravel framework based on the great work provided by [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). We created an interface that is familiar and easy to install for Laravel users. - -![Example 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-1.png?raw=true) ![Example 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-2.png?raw=true) - - -## Upgrade Guide - -Upgrade from v2 or v3 by changing your `composer.json` file to `~4` - -You **must** install the `imagick` PHP extension if you plan on using the `png` image format. - -#### v4 - -> There was a mistake when creating 4.1.0 and allowing a backwards breaking change into the master branch. The `generate` method will now return an instance of `Illuminate\Support\HtmlString` if you are running Laravel. See https://github.com/SimpleSoftwareIO/simple-qrcode/issues/205 for more information. - -There was a Laravel facade issue within v3 that causes some loading issues. The only way to fix this was to create a backwards breaking change so v4 has been released. If you are coming from v2 there is no need to change any code. The below change only effects users on v3. - -All references to the `QrCode` facade need to be changed to: - -``` -use SimpleSoftwareIO\QrCode\Facades\QrCode; -``` - - -## Configuration - -#### Composer - -Run `composer require simplesoftwareio/simple-qrcode "~4"` to add the package. - -Laravel will automatically pick up and install the package. - - -## Simple Ideas - -#### Print View - -One of the main items that we use this package for is to have QrCodes in all of our print views. This allows our customers to return to the original page after it is printed by simply scanning the code. We achieved this by adding the following into our footer.blade.php file: - -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

Scan me to return to the original page.

-
- -#### Embed A QrCode - -You may embed a qrcode inside of an e-mail to allow your users to quickly scan. The following is an example of how to do this with Laravel: - - //Inside of a blade template. - - - -## Usage - -#### Basic Usage - -``` -// All examples below assume you are pulling in the QrCode facade with the following line of code. The Facade is auto-loaded for Laravel users. - -use SimpleSoftwareIO\QrCode\Facades\QrCode; -``` - -Using the QrCode Generator is very easy. The most basic syntax is: - - use SimpleSoftwareIO\QrCode\Facades\QrCode; - - QrCode::generate('Make me into a QrCode!'); - -This will make a QrCode that says "Make me into a QrCode!" - -![Example QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/make-me-into-a-qrcode.png?raw=true) - -#### Generate `(string $data, string $filename = null)` - -`Generate` is used to make the QrCode. - - QrCode::generate('Make me into a QrCode!'); - -`Generate` by default will return a SVG image string. You can print this directly into a modern browser within Laravel's Blade system with the following: - - {!! QrCode::generate('Make me into a QrCode!'); !!} - -The `generate` method has a second parameter that will accept a filename and path to save the QrCode. - - QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); - -#### Format `(string $format)` - -Three formats are currently supported; `png,` `eps,` and `svg`. To change the format use the following code: - - QrCode::format('png'); //Will return a png image - QrCode::format('eps'); //Will return a eps image - QrCode::format('svg'); //Will return a svg image - -> `imagick` is required in order to generate a `png` image. - -#### Size `(int $size)` - -You can change the size of a QrCode by using the `size` method. Simply specify the size desired in pixels using the following syntax: - - QrCode::size(100); - -![200 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) ![250 Pixels](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/250-pixels.png?raw=true) - -#### Color `(int $red, int $green, int $blue, int $alpha = null)` - ->Be careful when changing the color of a QrCode, as some readers have a very difficult time reading QrCodes in color. - -All colors must be expressed in RGBA (Red Green Blue Alpha). You can change the color of a QrCode by using the following: - - QrCode::color(255, 0, 0); // Red QrCode - QrCode::color(255, 0, 0, 25); //Red QrCode with 25% transparency - -![Red QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-qrcode.png?raw=true) ![Red Transparent QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent.png?raw=true) - -#### Background Color `(int $red, int $green, int $blue, int $alpha = null)` - -You can change the background color of a QrCode by calling the `backgroundColor` method. - - QrCode::backgroundColor(255, 0, 0); // Red background QrCode - QrCode::backgroundColor(255, 0, 0, 25); //Red background QrCode with 25% transparency - -![Red Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-background.png?raw=true) ![Red Transparent Background QrCode](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent-background.png?raw=true) - -#### Gradient `$startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type)` - -You can apply a gradient to the QrCode by calling the `gradient` method. - -The following gradient types are supported: - -| Type | Example | -| --- | --- | -| `vertical` | ![Veritcal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/vertical.png?raw=true) | -| `horizontal` | ![Horizontal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/horizontal.png?raw=true) | -| `diagonal` | ![Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/diagonal.png?raw=true) | -| `inverse_diagonal` | ![Invrse Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/inverse_diagonal.png?raw=true) | -| `radial` | ![Radial](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/radial.png?raw=true) | - -#### EyeColor `(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0)` - -You may change the eye colors by using the `eyeColor` method. - - QrCode::eyeColor(0, 255, 255, 255, 0, 0, 0); // Changes the eye color of eye `0` - -| Eye Number | Example | -| --- | --- | -| `0` | ![Eye 0](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-0.png?raw=true) | -| `1` | ![Eye 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-1.png?raw=true)| -| `2` | ![Eye 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-2.png?raw=true) | - - -#### Style `(string $style, float $size = 0.5)` - -The style can be easily swapped out with `square`, `dot,` or `round`. This will change the blocks within the QrCode. The second parameter will affect the size of the dots or roundness. - - QrCode::style('dot'); // Uses the `dot` style. - -| Style | Example | -| --- | --- | -| `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `dot` | ![Dot](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/dot.png)| -| `round` | ![Round](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/round.png?raw=true) | - -#### Eye Style `(string $style)` - -The eye within the QrCode supports two different styles, `square` and `circle`. - - QrCode::eye('circle'); // Uses the `circle` style eye. - -| Style | Example | -| --- | --- | -| `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `circle` | ![Circle](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/circle-eye.png?raw=true)| - -#### Margin `(int $margin)` - -The ability to change the margin around a QrCode is also supported. Simply specify the desired margin using the following syntax: - - QrCode::margin(100); - -#### Error Correction `(string $errorCorrection)` - -Changing the level of error correction is easy. Just use the following syntax: - - QrCode::errorCorrection('H'); - -The following are supported options for the `errorCorrection` method: - -| Error Correction | Assurance Provided | -| --- | --- | -| L | 7% of codewords can be restored. | -| M | 15% of codewords can be restored. | -| Q | 25% of codewords can be restored. | -| H | 30% of codewords can be restored. | - ->The more error correction used; the bigger the QrCode becomes and the less data it can store. Read more about [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction). - -#### Encoding `(string $encoding)` - -Change the character encoding that is used to build a QrCode. By default `ISO-8859-1` is selected as the encoder. Read more about [character encoding](http://en.wikipedia.org/wiki/Character_encoding). - -You can change this to any of the following: - - QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); - -| Character Encoder | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - -#### Merge `(string $filepath, float $percentage = .2, bool $absolute = false)` - -The `merge` method merges an image over a QrCode. This is commonly used to placed logos within a QrCode. - - //Generates a QrCode with an image centered in the middle. - QrCode::format('png')->merge('path-to-image.png')->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->merge('path-to-image.png', .3)->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); - ->The `merge` method only supports PNG at this time. ->The filepath is relative to app base path if `$absolute` is set to `false`. Change this variable to `true` to use absolute paths. - ->You should use a high level of error correction when using the `merge` method to ensure that the QrCode is still readable. We recommend using `errorCorrection('H')`. - -![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### Merge Binary String `(string $content, float $percentage = .2)` - -The `mergeString` method can be used to achieve the same as the `merge` call, except it allows you to provide a string representation of the file instead of the filepath. This is usefull when working with the `Storage` facade. It's interface is quite similar to the `merge` call. - - //Generates a QrCode with an image centered in the middle. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); - ->As with the normal `merge` call, only PNG is supported at this time. The same applies for error correction, high levels are recommened. - -#### Advance Usage - -All methods support chaining. The `generate` method must be called last. For example you could run any of the following: - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); - -You can display a PNG image without saving the file by providing a raw string and encoding with `base64_encode`. - - - - -## Helpers - -#### What are helpers? - -Helpers are an easy way to create QrCodes that cause a reader to perform a certain action when scanned. - -#### BitCoin - -This helper generates a scannable bitcoin to send payments. [More information](https://bitco.in/en/developer-guide#plain-text) - - QrCode::BTC($address, $amount); - - //Sends a 0.334BTC payment to the address - QrCode::BTC('bitcoin address', 0.334); - - //Sends a 0.334BTC payment to the address with some optional arguments - QrCode::size(500)->BTC('address', 0.0034, [ - 'label' => 'my label', - 'message' => 'my message', - 'returnAddress' => 'https://www.returnaddress.com' - ]); - -#### E-Mail - -This helper generates an e-mail qrcode that is able to fill in the e-mail address, subject, and body: - - QrCode::email($to, $subject, $body); - - //Fills in the to address - QrCode::email('foo@bar.com'); - - //Fills in the to address, subject, and body of an e-mail. - QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); - - //Fills in just the subject and body of an e-mail. - QrCode::email(null, 'This is the subject.', 'This is the message body.'); - -#### Geo - -This helper generates a latitude and longitude that a phone can read and opens the location in Google Maps or similar app. - - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -#### Phone Number - -This helper generates a QrCode that can be scanned and then dials a number. - - QrCode::phoneNumber($phoneNumber); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### SMS (Text Messages) - -This helper makes SMS messages that can be prefilled with the send to address and body of the message: - - QrCode::SMS($phoneNumber, $message); - - //Creates a text message with the number filled in. - QrCode::SMS('555-555-5555'); - - //Creates a text message with the number and message filled in. - QrCode::SMS('555-555-5555', 'Body of the message'); - -#### WiFi - -This helpers makes scannable QrCodes that can connect a phone to a WiFi network: - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID of the network', - 'password' => 'Password of the network', - 'hidden' => 'Whether the network is a hidden SSID or not.' - ]); - - //Connects to an open WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - ]); - - //Connects to an open, hidden WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'hidden' => 'true' - ]); - - //Connects to a secured WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'encryption' => 'WPA', - 'password' => 'myPassword' - ]); - ->WiFi scanning is not currently supported on Apple Products. - - -## Common QrCode Usage - -You can use a prefix found in the table below inside the `generate` section to create a QrCode to store more advanced information: - - QrCode::generate('http://www.simplesoftware.io'); - - -| Usage | Prefix | Example | -| --- | --- | --- | -| Website URL | http:// | http://www.simplesoftware.io | -| Secured URL | https:// | https://www.simplesoftware.io | -| E-mail Address | mailto: | mailto:support@simplesoftware.io | -| Phone Number | tel: | tel:555-555-5555 | -| Text (SMS) | sms: | sms:555-555-5555 | -| Text (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | -| Text (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | -| Geo Address | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | -| Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -## Usage Outside of Laravel - -You may use this package outside of Laravel by instantiating a new `Generator` class. - - use SimpleSoftwareIO\QrCode\Generator; - - $qrcode = new Generator; - $qrcode->size(500)->generate('Make a qrcode without Laravel!'); diff --git a/docs/es/README.md b/docs/es/README.md deleted file mode 100644 index f8078fd..0000000 --- a/docs/es/README.md +++ /dev/null @@ -1,341 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - - -- [Introducción](#docs-introduction) -- [Traducciones](#docs-translations) -- [Configuración](#docs-configuration) -- [Ideas Simples](#docs-ideas) -- [Uso](#docs-usage) -- [Helpers](#docs-helpers) -- [Uso Común de QrCode](#docs-common-usage) -- [Uso fuera de Laravel](#docs-outside-laravel) - - -## Introducción -Simple QrCode es un empaquetador de fácil uso para el popular framework Laravel basado en el gran trabajo proporcionado por [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Hemos creado una interfaz que es familiar y fácil de usar para los usuarios de Laravel. - - -## Traducciones -Estamos buscando usuarios que hablen Árabe, Francés, Coreano o Japonés para traducir este documento. Porfavor cread una pull request si podeis ayudar con una traducción! - - -## Configuración - -#### Composer - -Primero, añadir el paquete Simple QrCode en su `require` en su archivo `composer.json`: - - "require": { - "simplesoftwareio/simple-qrcode": "~2" - } - -Luego, ejecutar el comando `composer update`. - -#### Service Provider - -###### Laravel <= 5.4 -Registrar `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` en su `config/app.php` dentro del array `providers`. - -#### Aliases - -###### Laravel <= 5.4 -Finalmente, registrar `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` en su archivo de configuración `config/app.php` dentro del array `aliases`. - - -## Ideas Simples - -#### Print View - -Uno de los principales usos de este paquete es la posibilidad de disponer QrCodes en todas nuestras print views. Esto permite a nuestros usuarios volver a la página original después de imprimir simplemente escaneando el código. Todo esto es posible añadiendo lo siguiente en nuestro archivo `footer.blade.php´. - -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

Escanéame para volver a la página principal.

-
- -#### Incorporar un QrCode - -Puedes incorporar un código Qr en un e-mail para permitir a los usuarios un ágil escaneo. El ejemplo siguiente muestra como hacer esto con Laravel. - - //Inside of a blade template. - - - -## Uso - -#### Uso Básico - -Usar el QrCode Generator es muy simple. La sintaxis más básica es: - - QrCode::generate('Transfórmame en un QrCode!'); - -Esto creara un código que diga "Transfórmame en un QrCode!" - -#### Generate - -`Generate` se usa para crear el QrCode. - - QrCode::generate('Transfórmame en un QrCode!'); - ->Atención! Este método debe de ser usado el último si se usa dentro de una cadena de comandos (chain). - -`Generate` por defecto devolverá un string de una imagen SVG. Puedes imprimirla directamente en un navegador moderno con el sistema Blade de Laravel con el siguiente código: - - {!! QrCode::generate('Transfórmame en un QrCode!'); !!} - -El método `generate` tiene un segundo parámetro que aceptará un nombre de archivo y un directorio para guardar el QrCode. - - QrCode::generate('Transfórmame en un QrCode!', '../public/qrcodes/qrcode.svg'); - -#### Cambio de Formato - ->QrCode Generator por defecto devolverá una imagen SVG. - ->Atención! El método `format` tiene que ser usado antes que cualquier opción de formato como `size`, `color`, `backgroundColor`, o `margin`. - -Actualmente hay 3 formatos compatibles; PNG, EPS, and SVG. Para cambiar el formato usa el siguiente código: - - QrCode::format('png'); //Devolvera una imagen PNG - QrCode::format('eps'); //Devolvera una imagen EPS - QrCode::format('svg'); //Devolvera una imagen SVG - -#### Cambio de Tamaño - ->QrCode Generator devolverá por defecto el tamaño de píxels mínimo para crear el QrCode. - -Puedes cambiar el tamaño de un QrCode usando el método `size`. Simplemente especifica el tamaño deseado en píxels usando el siguiente código: - - QrCode::size(100); - -#### Cambio de Color - ->Presta atención al cambiar el color de un QrCode. Algunos lectores tienen dificultades al leer QrCodes en color. - -Todos los colores deben ser expresados en RGB (Red Green Blue). Puedes cambiar el color del QrCode usando el siguiente código: - - QrCode::color(255,0,255); - -Para cambiar el color del fondo usamos: - - QrCode::backgroundColor(255,255,0); - -#### Cambio de Márgenes - -Es posible cambiar el márgen alrededor del QrCode. Simplemente especificamos el márgen deseado usando el siguiente código: - - QrCode::margin(100); - -#### Corrección de Errores - -Cambiar el nivel de corrección de errores es fácil. Unicamente usa el siguiente código: - - QrCode::errorCorrection('H'); - -Las siguientes opciónes son compatibles con el método de `errorCorrection`. - -| Error Correction | Assurance Provided | -| --- | --- | -| L | 7% of codewords can be restored. | -| M | 15% of codewords can be restored. | -| Q | 25% of codewords can be restored. | -| H | 30% of codewords can be restored. | - ->Cuanto más corrección de error se usa; el QrCode aumenta y puede almacenar menos datos. Para saber más sobre [corrección de error](http://en.wikipedia.org/wiki/QR_code#Error_correction). - -#### Encoding - -Para cambiar la codificación de carácteres que se usa para crear un QrCode. Por defecto `ISO-8859-1` está seleccionado. Para saber más sobre [codificación de carácteres](http://en.wikipedia.org/wiki/Character_encoding) You can change this to any of the following: - - QrCode::encoding('UTF-8')->generate('Transfórmame en un QrCode con símbolos especiales ♠♥!!'); - -| Codificador de carácteres | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - ->Un error de `Could not encode content to ISO-8859-1` significa que se esta usando una codificación de carácteres incorrecta. Recomendamos `UTF-8` si no está seguro. - -#### Merge - -El método `merge` une una imagen con un QrCode. Normalmente se usa para añadir logos en un QrCode. - - QrCode::merge($filename, $percentage, $absolute); - - //Genera un QrCode con una imagen en el centro. - QrCode::format('png')->merge('path-to-image.png')->generate(); - - //Genera un QrCode con una imagen en el centro. La imagen ocupa un 30% del QrCode. - QrCode::format('png')->merge('path-to-image.png', .3)->generate(); - - //Genera un QrCode con una imagen en el centro. La imagen ocupa un 30% del QrCode. - QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); - ->El método `merge` sólo es compatible con PNG de momento. ->El path del archivo es relativo al path de la app si `$absolute` equivale a `false`. Cambia esta variable a `true` para usar paths absolutos. - ->Se debería usar un nivel alto de corrección de error al usar `merge` para asegurarse que el QrCode se sigue podiendo leer. Recomendamos usar `errorCorrection('H')`. - -![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### Merge Binary String - -El método `mergeString` se puede usar para conseguir el mismo resultado que con `merge`, con la diferencia que permite proveer una representación en string del archivo en vez de el filepath. Ésto es útil al trabajar con el `Storage` facade. Su interfaz es muy similar a la de `merge`. - - QrCode::mergeString(Storage::get('path/to/image.png'), $percentage); - - //Genera un QrCode con una imagen en el centro. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); - - //Genera un QrCode con una imagen en el centro. La imagen ocupa un 30% del QrCode. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); - ->Igual que con `merge`, sólo PNG de momento. Lo mismo que con el nivel de corrección de error, alto nivel está recomendado. - -#### Uso Avanzado - -Todos los métodos soportan chaining. El método `generate` tiene que ser el último y cualquier cambio de `format` tiene que ser llamado primero. Por ejemplo: - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Transfórmame en un QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Transfórmame en un QrCode!'); - -Puedes mostrar una imagen PNG sin guardar el archivo usando una string y eligiendo la codificación `base64_encode`. - - - - -## Helpers - -#### Qué son los helpers? - -Los helpers son una manera fácil de crear QrCodes que causan que causan una acción en el lector al escanear. - -#### E-Mail - -Este helper genera un QrCode de e-mail que es capaz de rellenar dirección e-mail, asunto, y el cuerpo del e-mail. - - QrCode::email($to, $subject, $body); - - //Rellena la dirección - QrCode::email('foo@bar.com'); - - //Rellena la dirección, el asunto y el cuerpo. - QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); - - //Solo rellena el asunto y el cuerpo del e-mail. - QrCode::email(null, 'This is the subject.', 'This is the message body.'); - -#### Geo - -Este helper genera una latitude y una longitude que un teléfono puede leer y abrir la localización en Google Maps o alguna app similar. - - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -#### Phone Number - -Este helper genera un QrCode que puede ser escaneado y llama a un número de teléfono. - - QrCode::phoneNumber($phoneNumber); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### SMS (Mensajes de texto) - -Este helper crea SMS que pueden ser previamente rellenados con la dirección y el mensaje. - - QrCode::SMS($phoneNumber, $message); - - //Crea un mensaje de texto con el número rellenado. - QrCode::SMS('555-555-5555'); - - //Crea un mensaje de texto con el número y el mensaje rellenados. - QrCode::SMS('555-555-5555', 'Mensaje'); - -#### WiFi - -Este helpers crea QrCodes que conectan un teléfono a una red WiFI. - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID de la red', - 'password' => 'Password de la red', - 'hidden' => 'Si la red tiene SSID oculta o no.' - ]); - - //Conecta a una red abierta. - QrCode::wiFi([ - 'ssid' => 'Network Name', - ]); - - //Conecta a una red abierta y oculta. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'hidden' => 'true' - ]); - - //Conecta a una red segura. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'encryption' => 'WPA', - 'password' => 'myPassword' - ]); - ->WiFi scanning no es compatible con productos Apple. - - -##Uso común de QrCode - -Puedes usar un prefijo de la tabla dentro de la sección `generate` para crear un QrCode que almacene informacion avanzada: - - QrCode::generate('http://www.simplesoftware.io'); - - -| Usage | Prefix | Example | -| --- | --- | --- | -| Website URL | http:// | http://www.simplesoftware.io | -| Secured URL | https:// | https://www.simplesoftware.io | -| E-mail Address | mailto: | mailto:support@simplesoftware.io | -| Phone Number | tel: | tel:555-555-5555 | -| Text (SMS) | sms: | sms:555-555-5555 | -| Text (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | -| Text (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | -| Geo Address | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | -| Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -##Uso fuera de Laravel - -Puedes usar este paquete fuera de Laravel instanciando una nueva clase `BaconQrCodeGenerator`. - - use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; - - $qrcode = new BaconQrCodeGenerator; - $qrcode->size(500)->generate('Crea un QrCode sin Laravel!'); diff --git a/docs/fr/README.md b/docs/fr/README.md deleted file mode 100644 index 52f7180..0000000 --- a/docs/fr/README.md +++ /dev/null @@ -1,340 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - -- [Introduction](#docs-introduction) -- [Traductions](#docs-translations) -- [Configuration](#docs-configuration) -- [Utilisations Simples](#docs-ideas) -- [Usage](#docs-usage) -- [Helpers](#docs-helpers) -- [Usage Courant De QrCode](#docs-common-usage) -- [Usage Hors De Laravel](#docs-outside-laravel) - - -## Introduction -Simple QrCode est un adaptateur facile d'utilisation pour le framework Laravel et qui s'appuie sur le magnifique travail fourni par [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Nous avons conçu une interface intuitive, facile d'installation et familière aux utilisateurs de Laravel. - - -## Traductions -Nous recherchons des utilisateurs parlant arabe, espagnol, français, coréen ou japonnais pour nous aider à traduire cette documentation. Si vous vous en sentez capable, créez une pull request ! - - -## Configuration - -#### Composer - -Commencez par ajouter le paquet QrCode à la section `require` de votre fichier `composer.json`: - - "require": { - "simplesoftwareio/simple-qrcode": "~2" - } - -Lancez ensuite la commande `composer update`. - -#### Service Provider - -###### Laravel <= 5.4 -Ajouter l'entrée `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` au tableau `providers` du fichier de configuration `config/app.php`. - -#### Alias - -###### Laravel <= 5.4 -Enfin, ajoutez l'entrée `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` au tableau `aliases` du fichier de configuration `config/app.php`. - - -## Utilisations Simples - -#### Print View - -L'un des pricipaux usages que nous faisons de ce paquet et d'avoir des QrCodes dans toutes nos vues d'impression. Cela donne la possibilité à nos clients qui le flashent de revenir à la page d'origine du document après que celui-ci a été imprimé. Nous obtenons cette fonctionnalité en ajoutant le code suivant au fichier footer.blade.php. - -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

Flashez-moi pour revenir à la page d'origine.

-
- -#### Embarquer Un QrCode - -Vous pouvez embarquer un qrcode dans un courriel pour permettre à vos utilisateurs de le flasher. Voici un exemple pour mettre ceci en œuvre dans Laravel : - - // Dans un template blade. - - - -## Usage - -#### Usage De Base - -L'utilisation du Générateur de QrCode est très simple. La syntaxe minimale est : - - QrCode::generate('Transformez-moi en QrCode !'); - -Cela créera un QrCode qui dit "Transformez-moi en QrCode !" - -#### Generate - -`Generate` sert à fabriquer un QrCode. - - QrCode::generate('Transformez-moi en QrCode !'); - ->Attention! Cette méthode doit être appelée en dernier si vous l'utilisez dans un appel chaîné. - -Par défaut, `Generate` retournera le contenu d'une image SVG sous forme de chaîne. Vous pouvez afficher cette image directement avec un navigateur moderne dans un template Blade de Laravel de cette façon : - - {!! QrCode::generate('Transformez-moi en QrCode !'); !!} - -La méthode `generate` accepte un second paramètre pour définir un nom de fichier où enregistrer le QrCode. - - QrCode::generate('Transformez-moi en QrCode !', '../public/qrcodes/qrcode.svg'); - -#### Changement De Format - ->Le générateur de QrCode est prévu pour retourner une image SVG par défaut. - ->Attention! La méthode `format` doit être appelée avant toute autre option de formatage, telles que `size`, `color`, `backgroundColor` et `margin`. - -Trois formats sont actuellement supportés : PNG, EPS et SVG. Pour changer de format, utilisez le code suivant : - - QrCode::format('png'); // retourne une image PNG - QrCode::format('eps'); // retourne une image EPS - QrCode::format('svg'); // retourne une image SVG - -#### Changement De Taille - ->Le générateur de QrCode retournera par défaut le QrCode dans la plus petite taille possible en pixels. - -Vous pouvez changer la taille du QrCode par la méthode `size` qui prend comme paramètre la taille désirée en pixels : - - QrCode::size(100); - -#### Changement De Couleur - ->Changez les couleurs de vos QrCode avec précaution car certains lecteurs rencontrent des difficultés avec les QrCodes en couleur. - -Toutes les couleurs doivent être exprimées en RGB (rouge, vert, bleu). Vous pouvez changer la couleur de trait du QrCode par la méthode `color` : - - QrCode::color(255,0,255); - -La couleur de fond peut être définie de la même façon par la méthode `backgroundColor` : - - QrCode::backgroundColor(255,255,0); - -#### Changement Des Marges - -Vous pouvez définir une marge autour du QrCode par la méthode `margin` : - - QrCode::margin(100); - -#### Correction D'Erreur - -Il est très aisé de changer le niveau de correction d'erreur. Utilisez la syntaxe suivante : - - QrCode::errorCorrection('H'); - -Voici la liste des options supportées pour la méthode `errorCorrection`. - -| Correction d'Erreur | Capacité De Correction | -| --- | --- | -| L | 7% de redondance. | -| M | 15% de redondance. | -| Q | 25% de redondance. | -| H | 30% de redondance. | - ->L'élévation du niveau de correction d'erreur se fait au détriment de la taille du QrCode et de la quantité de données qu'il peut stocker. Pour en savoir plus, consultez [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction) (en anglais). - -#### Encodage - -La norme de codage par défaut des caractères contenus dans le QrCode est l'`ISO-8859-1`. Pour en savoir plus sur le codage, voyez [codage des caractères](http://fr.wikipedia.org/wiki/Codage_des_caractères). Vous pouvez changer le codage par le code suivant : - - QrCode::encoding('UTF-8')->generate('Transformez-moi en QrCode avec des symboles ♠♥!!'); - -| Codage Des Caractères | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - ->Une erreur du type `Could not encode content to ISO-8859-1` signifie qu'un mauvais codage est utilisé. Nous recommendons `UTF-8` si vous n'êtes pas sûr. - -#### Merge - -La méthode `merge` fusionne une image sur un QrCode. C'est une pratique courante pour placer un logo dans un QrCode. - - QrCode::merge($nom_de_fichier, $pourcentage, $absolu); - - // Génère un QrCode avec une image centrée. - QrCode::format('png')->merge('chemin-vers-l-image.png')->generate(); - - // Génère un QrCode avec une image centrée. L'image recouvre jusque 30% du QrCode. - QrCode::format('png')->merge('chemin-vers-l-image.png', .3)->generate(); - - // Génère un QrCode avec une image centrée. L'image recouvre jusque 30% du QrCode. - QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); - ->La méthode `merge` ne supporte que les images PNG. ->Le chemin vers l'image est relatif au chemin de base de l'application si $absolu est à `false`. Changez cette variable à `true` pour utiliser des chemins absolus. - -> Vous devriez utiliser un haut niveau de correction d'erreur avec la méthode `merge` pour assurer la bonne lecture du QrCode. Nous recommandons l'utilisation de `errorCorrection('H')`. - -![Fusion de Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### Fusion De Chaîne Binaire - -La méthode `mergeString` est semblable à la méthode `merge` si ce n'est qu'elle prend comme paramètre le contenu du fichier sous forme de chaîne au lieu du nom du fichier. C'est particulièrement utile lorsque vous travaillez avec une façade `Storage`. L'interface de `mergeString` est très similaire à celle de `merge`. - - QrCode::mergeString(Storage::get('chemin/vers/image.png'), $percentage); - - // Génère un QrCode avec une image centrée. - QrCode::format('png')->mergeString(Storage::get('chemin/vers/image.png'))->generate(); - - // Génère un QrCode avec une image centrée. L'image recouvre jusque 30% du QrCode. - QrCode::format('png')->mergeString(Storage::get('chemin/vers/image.png'), .3)->generate(); - ->A l'instar de la méthode `merge`, seul le format d'image PNG est supporté. Les même recommandations relatives à la correction d'erreur s'appliquent. - -#### Utilisation Avancée - -Toutes les méthodes supportent le chaînage. La méthode `generate` doit être appelée en dernier et toute modification du `format` en premier. Vous pourriez par exemple écrire : - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Transformez-moi en QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Transformez-moi en QrCode!'); - -Vous pouvez afficher une image PNG sans enregistrer de fichier en spécifiant une chaîne brute encodée avec `base64_encode`. - - - - -## Helpers - -#### Que sont les helpers? - -Les helpers facilitent la création de QrCodes qui déclenchent une action du lecteur lorsqu'ils sont flashés. - -#### E-Mail - -Cet helper génère un QrCode pour l'envoi de courriel dont les destinataire, sujet et contenu peuvent être prédéfinis. - - QrCode::email($destinataire, $sujet, $contenu); - - // Renseigne l'adresse du destinataire - QrCode::email('foo@bar.com'); - - // Renseigne le destinataire, le sujet et le contenu du courriel - QrCode::email('foo@bar.com', 'Ceci est le sujet.', 'Ceci est le contenu.'); - - // Ne renseigne que le sujet et le contenu du courriel - QrCode::email(null, 'Ceci est le sujet.', 'Ceci est le contenu.'); - -#### Geo - -Cet helper génère un QrCode avec des coordonnées géographiques (latitude et longitude) qui pourront être ouvertes par une application Google Maps ou similaire. - - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -#### Numéro de Téléphone - -Cet helper génère un QrCode qui lorsqu'il est flashé compose un numéro de téléphone. - - QrCode::phoneNumber($numeroDeTelephone); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### SMS (Messages Texte) - -Cet helper génère un QrCode d'envoi de SMS dont le destinataire et le message peuvent être prédéfinis. - - QrCode::SMS($numeroDeTelephone, $message); - - // Crée un SMS pour un numéro de téléphone - QrCode::SMS('555-555-5555'); - - // Crée un SMS pour un numéro de téléphone avec un message - QrCode::SMS('555-555-5555', 'Corps du message'); - -#### WiFi - -Cet helper génère un QrCode qui permet la connexion à un réseau WiFi. - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID du réseau', - 'password' => 'Mot de passe de connexion', - 'hidden' => 'Indique si le SSID du réseau est masqué ou non.' - ]); - - // Connexion à un réseau WiFi ouvert - QrCode::wiFi([ - 'ssid' => 'Nom du réseau', - ]); - - // Connexion à un réseau WiFi ouvert et masqué - QrCode::wiFi([ - 'ssid' => 'Nom du réseau', - 'hidden' => 'true' - ]); - - // Connexion à un réseau WiFi sécurisé - QrCode::wiFi([ - 'ssid' => 'Nom du réseau', - 'encryption' => 'WPA', - 'password' => 'Mot de passe' - ]); - ->La recherche de réseaux WiFi n'est actuellement pas supportée par les produis Apple. - - -## Usage Courant des QrCodes - -Vous pouvez utiliser un des pseudos-protocoles du tableau suivant comme paramètre de la méthode `generate` pour créer un QrCode contenant des informations avancées : - - QrCode::generate('http://www.simplesoftware.io'); - - -| Usage | Protocole | Exemple | -| --- | --- | --- | -| URL de site internet | http:// | http://www.simplesoftware.io | -| URL de site internet sécurisé | https:// | https://www.simplesoftware.io | -| Adresse de courriel | mailto: | mailto:support@simplesoftware.io | -| Numéro de téléphone | tel: | tel:555-555-5555 | -| SMS | sms: | sms:555-555-5555 | -| SMS avec message pré-défini | sms: | sms::I am a pretyped message | -| SMS avec message et numéro de téléphone pré-définis | sms: | sms:555-555-5555:I am a pretyped message | -| Coordonnées géographiques | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [Voir les exemples](https://fr.wikipedia.org/wiki/Code_QR#Correction_d.27erreur) | -| Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -##Usage Hors De Laravel - -Vous pouvez utiliser ce paquet en dehors de Laravel en instanciant un objet de classe `BaconQrCodeGenerator`. - - use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; - - $qrcode = new BaconQrCodeGenerator; - $qrcode->size(500)->generate('Créer un qrcode sans Laravel!'); diff --git a/docs/hi/README.md b/docs/hi/README.md deleted file mode 100644 index e0e77ce..0000000 --- a/docs/hi/README.md +++ /dev/null @@ -1,340 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - - -- [परिचय](#docs-introduction) -- [अनुवाद](#docs-translations) -- [विन्यास](#docs-configuration) -- [साधारण विचार](#docs-ideas) -- [उपयोग](#docs-usage) -- [सहायक](#docs-helpers) -- [साधारण QrCode उपयोग](#docs-common-usage) -- [लरावेल(Laravel) के बाहर उपयोग](#docs-outside-laravel) - - -## परिचय -सरल क्यूआरकोड [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode) द्वारा प्र्दान किए गये महान कार्य पर आधारित लोकप्रिय Laravel ढ़ाचा के लिए आसानी से प्रयोग करने योग्य आवरण है। हमने लरावेल उपयोगकर्ताओं के लिए परिचित व आसानी से स्थापित करने योग्य एक अंतरफलक बनाया है। - - -## अनुवाद -हमे उनकी खोज है जो इस दस्तावेज़ का अरबी, स्पेनिश, फ्रेंच, कोरियाई या जापानी मे अनुवाद करने मे मदद कर सकते हैं। यदि आप एक अनुवाद करने में सक्षम हैं तो कृपया एक पुल अनुरोध बनाए! - - -## विन्यास - -#### Composer - -सर्वप्रथं composer.json मे qrcode पॅकेज को अपने require से जोड़ें: - - "require": { - "simplesoftwareio/simple-qrcode": "~2" - } - -फिर composer update कमॅंड चलाएँ। - -#### Service Provider - -###### Laravel <= 5.4 -config/app.php में providers array में SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class को रजिस्टर करें। - -#### Aliases (उपनाम) - -###### Laravel <= 5.4 -आखिर में 'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class को config/app.php विन्यास फ़ाइल में aliases array में रजिस्टर करें। - - -## साधारण विचार - -#### Print View (प्रिंट देखें) - -इस पैकेज का मुख्य रूप से उपयोग हम सभी print views मे QrCode डालने के लिए करते हैं। यह हमारे ग्राहकों को स्कैन करके के बाद मूल पृष्ठ पर लौटने के लिए अनुमित करता है। हमने अपने footer.blade.php फ़ाइल में निम्न जोड़कर इसे हासिल किया है। - -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

Scan me to return to the original page.

-
- -#### Embed A QrCode - -अपने उपयोगकर्ताओं को जल्दी से स्कैन करने के लिए आप एक ई-मेल के अंदर एक qrcode एम्बेड कर सकते हैं। निम्नलिखित लरावेल के साथ ऐसा करने का एक उदाहरण है। - - //Inside of a blade template. - - - -## उपयोग - -#### Basic Usage (साधारण उपयोग) - -QrCode Generator का उपयोग बेहद आसान है: - - QrCode::generate('Make me into a QrCode!'); - -इससे qrcode कहेगा है कि "मुझे एक qrcode में बनाओ!" - -#### Generate - -Generate QrCode बनाने के काम आता है। - - QrCode::generate('Make me into a QrCode!'); - ->सचेत! यह विधि श्रृंखला में अंतिम में पुकारी जानी चाहिए। -`जेनरेट` डिफ़ॉल्ट रूप से SVG छवि की स्ट्रिंग लौटता है। आप इसे सीधे ही Laravel's Blade system से निम्न प्रकार से किसी भी आधुनिक ब्राउज़र मे प्रिंट ले सकते हैं: - - {!! QrCode::generate('Make me into a QrCode!'); !!} - -उत्पन्न विधि का एक दूसरे पैरामीटर है जो एक फ़ाइल का नाम और पथ QrCode को बचाने के लिए स्वीकार करता है। - - QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); - -#### Format Change(प्रारूप बदलें) - ->QrCode Generator डिफ़ॉल्ट रूप से SVG चित्र लौटाता है. - ->ध्यान रहे! `format` की विधि को किसी भी अन्य स्वरूपण विकल्प जैसे कि `size`, `color`, `backgroundColor`, व `margin` से पहले ही कॉल करें. - -निम्न तीन स्वरूप वर्तमान मे समर्थित हैं; PNG, EPS, और SVG. निम्न कोड का उपयोग करें: - - QrCode::format('png'); //Will return a PNG image - QrCode::format('eps'); //Will return a EPS image - QrCode::format('svg'); //Will return a SVG image - -#### Size Change (आकार बदल) - ->QrCode Generator डिफ़ॉल्ट रूप से सबसे छोटी संभव आकार से QrCode बनाएग। - -आप `आकार` विधि का उपयोग कर एक QRCode का आकार बदल सकते हैं। बस निम्न वाक्य-विन्यास का उपयोग करके पिक्सल मे वांछित आकर निर्दिष्ट करें: - - QrCode::size(100); - -#### Color Change (रंग का बदलना) - ->QrCode का रंग बदलते समय सतर्क रहें। कई उपयोगकर्ताओं को भिन्न रंगों मे QrCode पढ़ने मे कठिनाई होती है। - -सभी रंगों को RGB(लाल हरा नीला) मे व्यक्त करना आवश्यक है। आप निम्न का उपयोग करने QrCode का रंग बदल सकते हैं: - - QrCode::color(255,0,255); - -पृष्ठभूमि रंग परिवर्तन भी इस ही तरीके से व्यक्त किया जा सकता है। - - QrCode::backgroundColor(255,255,0); - -#### Size Change (हाशिया परिवर्तन) - -एक QrCode के आसपास हाशिया बदलने की क्षमता भी प्रदान की गयी है। इच्छित हाशिया निम्न वाक्य-विन्यास के अनुसार व्यक्त करें: - - QrCode::margin(100); - -#### Error Correction (त्रुटि सुधार) - -त्रुटि सुधार के स्तर को बदलना भी आसान है। निम्न वाक्य - विन्यास के अनुसार चलें: - - QrCode::errorCorrection('H'); - -`errorCorrection` की विधि के लिए निम्न विकल्प समर्थित हैं: - -| गलतीयों का सुधार | प्रस्तावित आश्वासन | -| --- | --- | -| L | 7% codewords में से बहाल किए जा सकते हैं। | -| M | 15% codewords में से बहाल किए जा सकते हैं। | -| Q | 25% codewords में से बहाल किए जा सकते हैं। | -| H | 30% codewords में से बहाल किए जा सकते हैं। | - ->अधिक त्रुटि सुधार के उपयोग से QrCode बड़ा हो जाता है और कम सूचना जमा कर सकता है। [त्रुटि सुधार](http://en.wikipedia.org/wiki/QR_code#Error_correction) के बारे मे अधिक पढ़ें। - -#### Encoding(एन्कोडिंग) - -वर्ण एन्कोडिंग को बदलें जिसका प्रयोग QrCode का निर्माण करने के लिए किया जाता है। डिफ़ॉल्ट रूप से `ISO-8859-1` एनकोडर के रूप में चयनित है।[वर्ण एनकोडिंग](http://en.wikipedia.org/wiki/Character_encoding) के बारे में अधिक पढ़ें। आप निम्न में से किसी के लिए इसे बदल सकते हैं: - - QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); - -| वर्ण एनकोडर | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - ->`Could not encode content to ISO-8859-1` त्रुटि का अर्थ है कि ग़लत वर्ण एनकोड का प्रकार उपयोग किया गया है। यदि आप अनिश्चित हैं तो हमारा सुझाव है कि `UTF-8` का उपयोग करें। - -#### Merge(विलय) - -`मर्ज` विधि एक QrCode पर एक छवि विलीन करता है। यह आमतौर पर एक QrCode के भीतर लोगो रखने के लिए प्रयोग किया जाता है। - - QrCode::merge($filename, $percentage, $absolute); - - //Generates a QrCode with an image centered in the middle. - QrCode::format('png')->merge('path-to-image.png')->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->merge('path-to-image.png', .3)->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); - ->`मर्`ज विधि में अभी केवल PNG ही समर्थित है। ->filepath app, base path से सापेक्षित है यदि `$absolute` सेट है `false` पर। इसे `true` से बदलें absolute paths पाने के लिए। - ->आपको `merge` विधि का इस्तेमाल करते समय उच्च स्तर के त्रुटि सुधार का उपयोग करना चाहिए। सुझाव है कि `errorCorrection('H')` का उपयोग करें। - -![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### Merge Binary String(द्विआधारी स्ट्रिंग का विलय) - -`mergeString` विधि `मर्ज कॉल` वाले ही परिणाम पाने के लिए प्रयोग किया जा सकता है, सिवाय इसके कि इसमे आपको फ़ाइल पथ की बजाय फाइल की एक प्रतिनिधित्व स्ट्रिंग प्रदान करनी होती है। यह तब उपयोगी है जब `स्टोरेज` मुखौटे के साथ काम किया जाता है। इसका इंटरफेस मर्ज कॉल की तरह ही है। - - QrCode::mergeString(Storage::get('path/to/image.png'), $percentage); - - //Generates a QrCode with an image centered in the middle. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); - ->As with the normal `merge` call, only PNG is supported at this time. The same applies for error correction, high levels are recommened. - -#### Advance Usage(अग्रिम उपयोग) - -सभी तरीके श्रृंखलन का समर्थन करते हैं। `generate` तरीका अंत मे कॉल करना तथा तरीका कोई `format` का बदलाव सबसे पहले कॉल करना आवश्यक है। जैसे की आप निम्न मे से कोई भी रन कर सकते हैं: - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); - -आप बिना फ़ाइल सुरक्षित करे, कच्चे स्ट्रिंग व `base64_encode` की एन्कोडेंग देकर भी PNG प्रदर्शित कर सकते हैं। - - - - -## सहायक - -#### सहायक क्या है ? - -सहायक QrCode का निर्माण करने का साधारण तरीका है जो स्कैन करने पर पाठक से निश्चित कार्रवाई करवाते हैं। - -#### E-Mail (ई-मेल) - -यह सहायक ई-मेल qrcode का निर्माण करता है जो ई-मेल का पता, विषय तथा शरीर भरने मे सक्षम होता है। - - QrCode::email($to, $subject, $body); - - //Fills in the to address - QrCode::email('foo@bar.com'); - - //Fills in the to address, subject, and body of an e-mail. - QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); - - //Fills in just the subject and body of an e-mail. - QrCode::email(null, 'This is the subject.', 'This is the message body.'); - -#### Geo (जियो) - -यह सहायक अक्षांश व देशान्तर का निर्माण करता है जिसे फोन पढ़ व Google Maps (गूगल मांचित्र) या अन्य app मे खोल सकता है। - - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -#### Phone Number (फ़ोन नंबर) - -इस सहायक द्वारा उत्तपन्‍न qrCode स्कैन करने पर नंबर डायल किया जा सकता है। - - QrCode::phoneNumber($phoneNumber); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### SMS (पाठ संदेश) - -इस सहायक द्वारा उत्तपन्‍न QrCode स्कैन करने पर SMS संदेश का भेजने का पता तथा संदेश का शरीर पहले से भरा जा सकता है। - - QrCode::SMS($phoneNumber, $message); - - //Creates a text message with the number filled in. - QrCode::SMS('555-555-5555'); - - //Creates a text message with the number and message filled in. - QrCode::SMS('555-555-5555', 'Body of the message'); - -#### Wi-Fi (वाई-फाई) - -इस सहायक द्वारा उत्तपन्‍न qrCode स्कैन करने पर वाईफाई नेटवर्क से जुड़ा जा सकता है। - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID of the network', - 'password' => 'Password of the network', - 'hidden' => 'Whether the network is a hidden SSID or not.' - ]); - - //Connects to an open WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - ]); - - //Connects to an open, hidden WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'hidden' => 'true' - ]); - - //Connects to an secured, WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'encryption' => 'WPA', - 'password' => 'myPassword' - ]); - ->वाई-फाई स्कैनिंग Apple उत्पादों में अभी समर्थित नही है। - - -## साधारण QrCode उपयोग - -आप निम्न तालिका मे से `generate` अनुभाग मे पाए गये उपसर्ग का उपयोग करके और अधिक उन्नत जानकारी स्टोर करने के लिए QrCode का निर्माण कर सकते हैं: - - QrCode::generate('http://www.simplesoftware.io'); - - -| प्रयोग | उपसर्ग | उदाहरण | -| --- | --- | --- | -| Website URL | http:// | http://www.simplesoftware.io | -| Secured URL | https:// | https://www.simplesoftware.io | -| E-mail Address | mailto: | mailto:support@simplesoftware.io | -| Phone Number | tel: | tel:555-555-5555 | -| Text (SMS) | sms: | sms:555-555-5555 | -| Text (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | -| Text (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | -| Geo Address | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | -| Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -## लरावेल(Laravel) के बाहर उपयोग - -आप `BaconQrCodeGenerator` नमक नयी कक्षा स्थापित करके इस पैकेज का लरावेल के बाहर भी उपयोग कर सकते हैं। - - use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; - - $qrcode = new BaconQrCodeGenerator; - $qrcode->size(500)->generate('Make a qrcode without Laravel!'); diff --git a/docs/imgs/200-pixels.png b/docs/imgs/200-pixels.png deleted file mode 100644 index 30d2c37cda77515ccb0697e835d00201f9f6d809..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1524 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 diff --git a/docs/imgs/diagonal.png b/docs/imgs/diagonal.png deleted file mode 100644 index 439871493cc8d3cccdd0ae156986e53d0e2e9055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6519 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 a!%%HT$w`DS(sNf00cfadKdn%<2>Bm!MUhSb diff --git a/docs/imgs/dot.png b/docs/imgs/dot.png deleted file mode 100644 index b8126021816e2e6e3459abbf6bdbccdb86795f8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5459 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 JPDHLkV1gE2eQ^K) diff --git a/docs/imgs/example-1.png b/docs/imgs/example-1.png deleted file mode 100644 index fbc43d47ec17ba7a379fcf3ca8a3f5e81e06e12a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8269 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 Dy2ril diff --git a/docs/imgs/example-2.png b/docs/imgs/example-2.png deleted file mode 100644 index adde1a98a06a8b5cfdafe3c3d13d102bbeff0732..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24639 zcmYhi1zc1?_ddQzcP`xss0&DUNP~1OOYhRsNJw`hB@#-50=kPVAl)q?p>&6INQpGR z>-)a{&;JYTuv~WL-kCY^oada0*VR@fCZHz(fk4FSYD)Sb5C+e`7ak69#XmUN2l$2M zAg?740#&6D-XO4nzgcb6^tC{s04@+HED8j=0xpGZgFrs~AkZ!x1d_}KfoME(oAjiC zf8bbas49W(|9uy>mZgJ0Rt@S(@`iqM2YIjH49au&?GTMjUbDm2dU4OBbn(_V%oLKp z#3ffB;kHL&9?B#mI|5r6jaLp=wpHgJ=A3kK0`9Q;6MfrEBIbixXscN$A!M8Up zkjmW4yL7*gv+wd8HcK4r9r6+EA*T$;I0UOTZCEFowqI_hcjkV*?=J>F(W(Z~>bYA` z0ozh!_)u}uN$`(;mt_a@iP3L_!;k*Vo^4mka}sHVY$=Z%>`e?U+{h}rWPgzDd_BkV zRAzqrcD#zYVXuAP%Ihwo*C{%V0oKUWoeYmYjs}C`XmPCF z;35I^F?8Q$=)1f1VS2~?ko&NVvJxg8MDOdTC>LX8DyTwa2LHBQmFakiUP(wHi)8u$ zxBsptmoU+Ji7GO@*U3jJZ@^l<%ru(%;{%n%*?z1N^a&URdZvls@G zha!nx&kNDk<_3ui+;q>B5S;w5B%vxp9L&t%qf$&%2dI6nmDtRQ@951|<{Tjj+8Xo~ znE^W!G-~POD`D=sMmqVYWrYXfO zkm2azUr1%07MG>YLjYM0gx1~1JwiP~?bmWiWx+}d-VXm_d|;i1_m?V*BB}m~P*(PN za@S7J`8jen@evA3u=7v^1-m2DgXzI$Awui~qgGXYJ6AVvy`@E+*`E5#ih5yea($FC zn(|77viyn87KAMf(>OV3zI5>6Er#qfhBcO2t5NesRm%^i;JmdMcP-=tmaVpwM!tNWz zX!_7mCqIJlu7s`x;70@IDd8Y;(r!%vDe6pkqj5n62+;=rn5XjyE!^nt;wiVE;@O=u zXXWi81g2-M#Ry|+*^xE1!s1=L`ZAvn=C@YcZgs#`8nXR*u3D~xEJ7FOgF&qN^qPCF zQCELVQ)D3X*yP;Z&z?+89e`1O z?s~#6r4KtkFll_B%Hne>w7&X*HlsPIU>UJuBh|*Xc{@0u*yC;HjMQCP>@_WAXq)NL zs9m_2j74prwhy}MuAJnUHVr(9k!+-iMdn6?@CJlmtg3e}s!GC;O41YR9z93xPodsW3iHmsMXsIDKkbG+tP;Etpl=^vH{E?dK z$4V4&3D?Zs5N=Y0nFUyZGaQzc9xIjTzzTnhSk!=g>H9oPc=4-?Zi4u1b#Q;c&*REm zNiEXvv9rD-ZSvwdnWaQ9t=S$j6-*wT^D+@F>ReqwWcCOZgaN^Y`?rgw4py*5=Oh&j zU8b;B(WZPi-8N!G`bZd{`5Y2PogSOhM{zqm?M$!9x>#HwjGm;uio!)lxT>ikM2_Lg z%7~3=H)=&mkyvCo;rgSGmMIB`+K>JO+(&@_8HbCkLC0s4a8g6QWX)4tSW=w$E(=

L{+6q^#`HVyj0!h(kQ61r(@F`6cHCWSX+3t!pe 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 diff --git a/docs/imgs/eye-0.png b/docs/imgs/eye-0.png deleted file mode 100644 index f562213343fbbbf0a617f60e2b2402cc5173d112..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1434 zcmX|>c~p{F6u>{+mrPU1Q7f_3#tluQGLyh1aomMEIXN!q3C+>c+*c$utx>rMJn%LAh>4>&?avKpfF-udT32{L|2b?qW$9wm@ckj9PzWclH7W(esH~1C=k%zXaHy~Q5T0PO3$!xOn^54q?rK#F&6+fq*ufR07$e2 zfW=S%IC&2M^sbaM{ZC01Fa5l5Zrj`2>nl95czu3;ULX+g`TVuDwZ>Ark5kX3CS)=> zAt8amV03hJR8>_if1Md0AD^9_-I9nmH#fr=-8lL)kyv73VUe1ey1u^d=;&xy+9;7o z_U_%gv9YndybOY1czF20zyOoU?CtHHoSdwztn~NypP89KB9ViGgUesJY&LsqYioFT zxVyW1ZfRkH=eDT3T6I zSxwX6Y_0>%9pX<0lxT+z6ci7!)}a}y|CrI`^_ElKy$jq^jqPzPKaF1@91 zExR`OMEd#YV`aPu%&v{?yY`fx!7>Lk1qcbILi+hoV@AvTv^8zS3vHc%J&y2S(BY?i zA!n{7Dc^CyUP+m$4!cBEMyf&}3R);2^$hs1)B_5;EDQsc(zUL)c^B)`8cNh292hO1 zBRx$HM4wzdEH9@5Bc2Lpaj-`SNRZLrsqi_mH)t-W{J9QUUR&sm?<5=tG5o$RDA5m) zxlNK2Adj#$SfPYjn!mcRAAF!XJO_+sICT^v)1n(r|G{N%_u__-bhV8q)EHI z^L}&nfXhu*uj47!Pva(psb%{>PX2cj6^2dJLwmFZhgXcEwJ+EvO(dk0F;yEWV-+T! zoi zzh{s6{S(hF0xr4Qx04;Q{<@dZOJnQ+_5QmCif=`RAZKK^xu>2TjcTdaa+2gBdhJ7D z23k`BRJ%B?xe0+~wwZ!1(o@8~AulI*ox^?_k@j^_ZikIg0S6jEVo5N8V3+VM+bqt| zGHuoL8q3LXbdo|%Pv6eVI(vefeKYHW&w=O$N^5dY^SPFyk1;YJ;1n_A)?b_Bw_%9| zA<&z70#n@I*3hB$qPzNONp95Hi;u-sw#Nv+b~<&HXZ+6)eTiRF=mjq4BRk+G)zoU0 z=AsvL=lu8&Y2EZ|cF#`Z$%;c3OZRkkcy@!VrQD4t%02gsLeP)r`jU2!t_yj);_Fi` z@7NW!6kNcFne8D6a}!sCHBwQc=Y*jQWK}du@^PQGcGRg(RXdXMaf+enTADa#l2Q)@YRu4i?D;`Cpl6iy%y>T9H=MO8wEo1Rt|Cq{S+2 hIxPqxN~ZwMcpGw;{mY|nh@Wio0v>KYt_o5uhE diff --git a/docs/imgs/eye-1.png b/docs/imgs/eye-1.png deleted file mode 100644 index 852221232b714717f766ddfe40cf84b004539248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1415 zcmV;21$g?2P)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw0002P zP)t-s|NsBz=jZqL_ww@c?(XjV{P_6w>;M1&uCA_=laq9GbmiT?ua+{mx3{68q1f2i z;^N}-@8J9U`~Lm>J3BinDk}K+_<4DG`TYGP=n)&(pg@uJ_X=&{2?Cb06_4V~U5wF|;0004E zOGiWihy@);000CwNklLH25(Hg3t!TQ9iW^X?v-0>;P1(^3U3 z)~Bs%4qk_39}qwQ0R)g|1Uc-eQ~}bp4}-MXpUWZC`G`S|?PCS8Ue)xxAm%6=$Q$cV z1_Tg50C~oclfIbK5C{!&CPB_G#Ju%^^yP^>a);CgDnof@C&)W77Zrd|009ILKz0K1 zK2g~X$Y`vxWkRGTqbfse_UxHU6hHt01Q0-6A(s=CEf8vQxf3({aH?{pYObhY$CfBV zak~u&Ab$xdMPZP+Zn97r?!={bZ*3I4n;`H%szOmNp!(f+_US% zD!gVM8%fkCP1!n8O~$OIQ#izYs>{||EPwz42q1twZtf_oH$i4{Q-a8Y(50G~e;|v+ zv|9IhhR7fbRj_1`8r!qWkfrp`odN;~AbrH+gpD>6A$``Tp1t|qK+Kw%c=jt_mz8e^HC-U8rV9ulfB^Cm zAm&uy1d->FvLJWale11@cD9(=*9;=h>{N57YVP&;EBjO7M7(8c5qYhZvS;s!Ypo=Y z<843y0R)iUfP9h9``D2nO^9DD4h!WbRPZem($$^U4l}#Yr5d(GX~~^w&%Q8cb~%1a z6hHt01Q0;nAPw`@gcIbfZJ%2cGNhWO2+^ItXF|qu=eXe8K@RVa=(s>SWnFUu1Q0*~ zDHxLT-FOGcH4UasT+CKZI(9Ac|Idjtp|fB*uBH-ui6 zeo!?J;@i`OK|D#nsKGW+g9wFw*WCiT)F;-1|GV)O+B5I_I{#1=9(;{*A{erTp>NR$|{S)wde z+l2_xfWB(lEgIsr)?&AVwm`D4IROF)Ab>bPR`ffRg9<@{elwJwA>OgRLl4Mr>U=`? zSM+e}Vh*ug9)>zV%0G<<1Q0*~c>;)iwm_)K+5)1Qra)*E>a0KcPg!?SV)H&bAbqGzm002ovPDHLkV1h78k>LOU diff --git a/docs/imgs/eye-2.png b/docs/imgs/eye-2.png deleted file mode 100644 index eb721e72d65af619dfbe89ee50ffb614c56ddf52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1434 zcmXw3do-J882{9Du3sx<)#~}Q=8|@0Mq9VkC5jRxjP26tKLvt01g8Hc{Tt*Dgl5km5Q_g0GW;e zuyhpw+-d;8{O0|3tcS|b6BZodx4XMLKR>^@xw*Q!Dv?N3>Xw!k3Wbu9k-=uO84L!G z$D5g%+1}oEcXvl3kusSqH#b+QRGOKYZEbC>t*yZ@92XZiFfh>G-rm>OH!(3$Utf>K zVyC92P$<;!@Gzgx-`UyWa=G2z-6D}_VPQckl}=AjD-;R`2Zzke%<%B=@$qqmLN+`3 zW^H9!C=|*z#Lugps8s6O%G8chAy+8na(M)^!>Rf?nM{sp=}t;Y5{t#l%gY-Z8;>PX z0#)A{u|fW5pj_KBKt)SnAlf@3NAO|t;zhwZgw7NQf@sGi^ov92pf=rHCbn|UmG;&Pv)S|T`s68!YYYhK6+xVnxV1n#)U#CmrRLC{(UL1S=6>>|J5ToW zsnzz^T2U$C-1R)75$FYIXu)_b{z^@R#>iNiw?OQ7$fwTaOY33UDeuu}m(EMzrv0&i zP-Wt0PeWJnodYtj1uOr3@lcn{(WKGAgc*|+0M_=da#A6NVx~|VLa2S~NFC>bvozB^ zocWFrj`9!E*O@3C4OJUKFP2ZpS(}5v_$zvZ7!x_mI6odM)boxOFPNkMkxT%#CMK zgTjdk^saZ$^=%cx2H|g%uC~7h`S~;KNY>ri6m|3@se|%h+s8-eSEGydD>#&VB$g*mAGJlA*4{y^SX2FUxZN z*b(FJYp#wfX$-tH?QN`C>#u~;L{e3kg~_LtU)2H&PI|T51Znp=U)E$W!|+=x5;|+B zffGJyY!K~~;8Ni}_QAum#E diff --git a/docs/imgs/horizontal.png b/docs/imgs/horizontal.png deleted file mode 100644 index 6fa7f20edf598ee5d0ce40667cea01e59f2af44a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3767 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 diff --git a/docs/imgs/inverse_diagonal.png b/docs/imgs/inverse_diagonal.png deleted file mode 100644 index cc5b5f959dc9cf29e837e16c00eff4f8d0909e44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7432 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 D-_Kg* diff --git a/docs/imgs/make-me-into-a-qrcode.png b/docs/imgs/make-me-into-a-qrcode.png deleted file mode 100644 index 9916609fe4b6302490ab357fec794425322347ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2197 zcmV;G2x|9004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 zVoOIv0RM-N%)bBt2ogy|K~#9!?Ok1LR7Dg%+l4I)4e7Q}uz-nWg;X0KN+cCa`e5jj z0x?<=i19&M#h54*6CS{(pb3fm#HbIpk)WnN6dsUZq9rjQLX1sH3?bn`FouG%P1+*A zX=!(Sm~)ps({rbD?{@nG=e*3GGc#xAyLaczx#!NzjVO3Dr~m|r01+SpWG2xpOfOsv zQTeqP0KlD-R9gGw_%*MdrTqFL0D$4+Av#g@oKBUdjxbkYKq;kEuOU6F#wP;@^eUy4 z8VJ*g4y{qfhyW2FkD2++JKdjTAPp{+I;jeyP9ayNZ;`c~SvmK@oJSfQCV?S3k2q1v z=tUP-C^L@?IcRK&pNDu&rCOU8Ph9+ZrE6i3b5v8RS}28v??gVx?nPj*6;funQ0Y zl0U0899+jR%SUDhs2a<;7bcL-&cG_JEyEx6I;qvk>fgt&s=ODcy-SI_aB3&SpCSMN zr@Lf~2oM1xKxT#;{~={}PAZTHu8kkQ8=`VTCxbX~cy9bN002;eg;IKAESw7f05`F{ z`O)mEhNeI?FGlW2EEfJ^BshMQ&n~uBO~@D#AOa-c=J(D`YccAaUL#U`6xT2Y+M0wl$81f?R;Vzp1ShoA zoJWWzug;h|60x#YsnhdMAbG@HlMHqNB0vI~-_ussD$SWje+l1?7e%>>Mzq$mp)3nj zYT8|$RF;h2?0_*-JRbu97%Xw=GP?0T^9a&CPkc)$rPO7%)R0dLX_X_nZE&jpk zAOd7Uyk87}MuXT=UL0i$1yRg*#tx)lwN9^Kv7TxGfCx$fBOAkqS`Sr+i<9mp-*$V@4=Fo3z(g<y`4u1n}{U z&pC%5Q~vf|!oF@@e)kD0JrbhppX#Kpj*p_GQmIrbm5HL@wtA!y>iudVA4M6Vg;IQH zk~;H{A=XmAouN9{*cm!z+A8DfmhmcQCjcJ4E%770HOZDahKgf0#bq+s1&9Ed05`tR z#+Ev{+kH9r>Sl2L9*`xiI&GnA8k^`oNbSbY!m{Sl!&Xa-We#Tk*v;iG_gY7O5evX8 z)E*>?!c!0Dup1`~m`fT{q_FYqk_-|>xvZ2@>Xspu69xo`0FiKzKW($-*09o79Q1zq ztxM~ht+{?tlo5tb@G1`J+@$BmlRB+@oi5DQ&3bNpvleDvhHBO?iju8C`QDKrA+uhz@o z0Dvn=!)Oxj=YzI(aBI?Dbj@2|004m9)QwO62><{W|J7_gZD%F+kxGpSmEW4ib+*ox zlD(Qg2fFuK@oqM+stN$Imd4ky3*0M~0|4BX!7e}qNdCQF&(RE1N(E7+0=Me{DL_L@ z%|!&IgXFA}VJ~`;x#j^ZAf`(^G6QoX(w!^#eK15%J+Kv0Az8XZNwn zVJtbXc+kcg``M3g3DK_J8CvKq2_#!nMvdj+%?^Ko%#!jU@-)$3LR1`VcZ#9}r-cVx zO3nW$=Z3cFD9S+@>;go9$UHLX)V(L)KpMVtsN`~vR}^C{`&+o&2kaqS2`@eqn}9pw zpu_E4wJ;~f#AJ*J5CJmD=Jyi+jky&?4leQEyd2+M@&~Q<_2mi3VSe3UkHdMdJ@u^E zi^l7%Nl%^7+(yi`#!E`S)~T@q8&#~F(h0F#A1?3s1#kW&`ueyGb^#(lWF84anPYN2 zYe`x5n-S+~Y1w{O1(miNpZURqyYg_p7Sa#ot4VuXY-JOAQO#i^WdBbL0O0&886yHj zfC!L0m|q`ipIlWF2?STUlmh_3sP*G+)mYZ)e5?K@qTg6lQ#$cLD%_9ViZ2h-0A15q zE^fR45g^mT{N{mf2M1EYf3rEjXH6qMUwsa6pkTa_P9tb{J;hEZ)$GdsKiihGipn;A zK5Uc0Eakb8e5ZS-R6A&0I(73@OxT~E^e5XGkaXdhyW2F0>o_|sS2}% zeI5V+6n790y#iVM_+A~dOLVgH0e2m1un@lPeEUtE;(Jbe*Q&5_C4VgeB0vPlOrrk* Xz`_p4B5lE700000NkvXXu0mjf2tx1! diff --git a/docs/imgs/merged-qrcode.png b/docs/imgs/merged-qrcode.png deleted file mode 100644 index ec0e3164d8e0904d4436994ea37639f20b8f0864..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11462 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 diff --git a/docs/imgs/radial.png b/docs/imgs/radial.png deleted file mode 100644 index 2cc4b916f6b1edfd748b9e500f41a73cb09a9e39..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9498 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 diff --git a/docs/imgs/red-25-transparent-background.png b/docs/imgs/red-25-transparent-background.png deleted file mode 100644 index 382cc1d4eac963aa2d6a10e41a24e0b4b3b0f9de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1549 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 diff --git a/docs/imgs/vertical.png b/docs/imgs/vertical.png deleted file mode 100644 index 13629fbdeaf38fbe6955871a98ae3b07e40230bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4605 zcmV004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00006 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 diff --git a/docs/it/README.md b/docs/it/README.md deleted file mode 100644 index 8dcf2c7..0000000 --- a/docs/it/README.md +++ /dev/null @@ -1,342 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - - -- [Introduzione](#docs-introduction) -- [Traduzioni](#docs-translations) -- [Configurazione](#docs-configuration) -- [Semplici Utilizzi](#docs-ideas) -- [Utilizzo](#docs-usage) -- [Helpers](#docs-helpers) -- [Uso generico dei QrCode](#docs-common-usage) -- [Uso al di fuori di Laravel](#docs-outside-laravel) - - -## Introduzione -Simple QrCode è un semplice wrapper per il popolare framework Laravel basato sul bellissimo lavoro [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Abbiamo creato un'interfaccia familiare e semplice da installare per gli utenti Laravel. - - -## Traduzioni -Siamo alla ricerca di utenti che ci aiutino a tradurre la documentazione in Arabo, Spagnolo, Francese, Coreano o Giapponese. Se pensate di potercela fare non esitate a fare una pull request! - - -## Configurazione - -#### Composer - -Per prima cosa, aggiungete il pacchetto di Simple QrCode al file `require` in `composer.json`: - - "require": { - "simplesoftwareio/simple-qrcode": "~2" - } - -Ora lanciate il comando `composer update`. - -#### Service Provider - -###### Laravel <= 5.4 -Registrate `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` nel vostro `config/app.php` all'interno dell'array `providers`. - -#### Alias - -###### Laravel <= 5.4 -Infine, registrate `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` nel vostro file di configurazione `config/app.php` all'interno dell'array `aliases`. - - -## Semplici Utilizzi - -#### Print View - -Uno degli usi principali di questo pacchetto è la possibilità di avere codici Qr in tutte le nostre print views. Questo permette all'utente di tornare alla pagina originale semplicemente facendo lo scan del codice. Tutto ciò è possibile aggiungendo le seguenti linee nel nostro footer.blade.php. - -

- {!! QrCode::size(100)->generate(Request::url()); !!} -

Scansionami per tornare alla pagina principale.

-
- -#### Incorporare un QrCode - -Potreste incorporare un codice Qr in una e-mail per permettere agli utenti uno scan immediato. Il seguente è un esempio di come potresti fare tutto ciò con Laravel. - - //Inside of a blade template. - - - -## Utilizzo - -#### Utilizzo Base - -Usare il generatori di codici Qr è molto semplice. La sintassi più semplice è: - - QrCode::generate('Trasformami in un QrCode!'); - -Questo comando produrrà un codice Qr che dice "Trasformami in un QrCode!" - -#### Generate - -`Generate` è usato per creare codici Qr: - - QrCode::generate('Trasformami in un QrCode!'); - ->Attenzione! Questo metodo deve essere chiamato per ultimo se lo si usa all'interno di una catena (chain). - -`Generate` restituirà, di default, una stringa di immagini SVG. Puoi stamparla direttamente in un browser recente dal sistema Blade di Laravel con il seguente codice: - - {!! QrCode::generate('Make me into a QrCode!'); !!} - -Il metodo `generate` accetta un secondo parametro che indica la directory nella quale verrà salvato il codice Qr. - - QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); - -#### Variazione del formato - ->QrCode Generator è impostato di default per generare immagini SVG. - ->Attenzione! Il metodo `format` deve essere chiamato prima di qualunque altra opzione di formato come `size`, `color`, `backgroundColor`, o `margin`. - -Momentaneamente, sono supportati tre formati: PNG, EPS e SVG. Per cambiare il formato usare uno dei seguenti comandi: - - QrCode::format('png'); //Genererà un'immagine PNG - QrCode::format('eps'); //Genererà un'immagine EPS - QrCode::format('svg'); //Genererà un'immagine SVG - -#### Variazione della grandezza - ->QrCode Generator restituirà, di default, la più piccola grandezza possibile per creare il QrCode. - -Puoi cambiare la grandezza del codice Qr usando il metodo `size`. Basta specificare la grandezza desiderata, in pixel, usando la seguente sintassi: - - QrCode::size(100); - -#### Variazione del colore - ->Fai attenzione quando cambi il colore di un QrCode! Alcuni lettori potrebbero avere dei problemi a leggere dei codici Qr colorati diversamente. - -Tutti i colori dovranno essere espressi in RGB (Rosso Verde Blu). Puoi cambiare il colore di un QrCode usando questa sintassi: - - QrCode::color(255,0,255); - -Puoi anche cambiare il colore di sfondo con la seguente istruzione: - - QrCode::backgroundColor(255,255,0); - -#### Variazione del margine - -E' anche possibile variare il margine attorno al codice Qr. Basta infatti specificare la grandezza del margine nella seguente sintassi: - - QrCode::margin(100); - -#### Correzione dell'errore - -Cambiare il livello di correzione dell'errore è facile. Per farlo, usare questa sintassi: - - QrCode::errorCorrection('H'); - -Seguono le opzioni supportate dal metodo `errorCorrection`. - -| Error Correction | Assurance Provided | -| --- | --- | -| L | 7% of codewords can be restored. | -| M | 15% of codewords can be restored. | -| Q | 25% of codewords can be restored. | -| H | 30% of codewords can be restored. | - ->Più error correction viene usata, più sarà grande il QrCode e meno dati sarà in grando di contenere. Leggi di più a riguardo [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction). - -#### Encoding - -Puoi cambiare l'encoding dei caratteri utilizzato per creare il codice Qr. Di default è selezionato `ISO-8859-1`. Leggi di più a riguardo [character encoding](http://en.wikipedia.org/wiki/Character_encoding) -Puoi cambiare l'encoding utilizzando: - - QrCode::encoding('UTF-8')->generate('Trasformami in un QrCode con simboli speciali ??!!'); - -| Encoder dei caratteri | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - ->L'errore `Could not encode content to ISO-8859-1` significa che si sta usando l'encoding erraro. E' raccomandato usare `UTF-8` se non si è sicuri. - -#### Merge - -Il metodo `merge` unisce un immagine con un QrCode. Il merge è molto usato per inserire loghi in un codice Qr. - - QrCode::merge($filename, $percentage, $absolute); - - //Genera un QrCode con una immagine al centro. - QrCode::format('png')->merge('path-to-image.png')->generate(); - - //Genera un QrCode con una immagine al centro. L'immagine inserita occupa il 30% del codice Qr. - QrCode::format('png')->merge('path-to-image.png', .3)->generate(); - - //Genera un QrCode con una immagine al centro. L'immagine inserita occupa il 30% del codice Qr. - QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); - ->Il metodo `merge` supporta solamente il formato PNG. ->Il percorso specificato è relativo alla base path se `$absolute` è impostata su `false`. Cambiare questa variabile in `true` per utilizzare percorsi assoluti. - ->Dovresti usare un alto livello di error correction quando usi il metodo `merge` per assicurarti che il Qr sia ancora leggibile. Raccomandiamo di usare `errorCorrection('H')`. - -![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### Merge Binary String - -Il metodo `mergeString` può essere usato per ottenere quasi lo stesso risultato di `merge`, con la differenza che permette di inserire una rappresentazione testuale del file al posto del percorso. Questo è utile quando si lavora con la facade `Storage`. La sua interfaccia è molto simile a quella di `merge`. - - QrCode::mergeString(Storage::get('path/to/image.png'), $percentage); - - //Genera un QrCode con una immagine al centro. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); - - //Genera un QrCode con una immagine al centro. L'immagine inserita occupa il 30% del codice Qr. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); - ->Come la chiamata a `merge`, anche questa volta è supportato solamente il formato PNG. Lo stesso vale per gli error correction, H è il valore raccomandato. - -#### Utilizzo Avanzato - -Tutti i metodi supportano il chaining. Il metodo `generate` deve essere chiamato per ultimo e tutti gli eventuali metodi `format` devono essere chiamati per primi. Per esempio sono validi i seguenti: - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Trasformami in un QrCode!'); - -Puoi mostrare un'immagine PNG senza salvare il file relativo impostando una stringa e scegliendo l'encoding `base64_encode`. - - - - -## Helpers - -#### Cosa sono gli helpers? - -Gli Helpers sono un metodo molto semplice per creare codici Qr che permettono al lettore di eseguire una certa azione quando scansionati. - -#### E-Mail - -Questo helper genera un QrCode in grado di riempire i campi di una e-mail quali indirizzo, oggetto e corpo. - - QrCode::email($to, $subject, $body); - - //Fills in the to address - QrCode::email('foo@bar.com'); - - //Fills in the to address, subject, and body of an e-mail. - QrCode::email('foo@bar.com', 'Questo è l'oggetto.', 'Questo è il corpo del messaggio.'); - - //Fills in just the subject and body of an e-mail. - QrCode::email(null, 'Questo è l'oggetto.', 'Questo è il corpo del messaggio.'); - -#### Geo - -Questo helper genera una latitudine e una longitudine che un telefono può leggere ed aprire con Google Maps o applicazioni simili. - - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -#### Numeri di Telefono - -Questo helper genera un QrCode che, una volta scansionato, digita un numero di telefono. - - QrCode::phoneNumber($phoneNumber); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### SMS (Messaggi) - -Questo helper crea messaggi SMS che possono essere precompilati con il destinatario e il corpo del messaggio. - - QrCode::SMS($phoneNumber, $message); - - //Creates a text message with the number filled in. - QrCode::SMS('555-555-5555'); - - //Creates a text message with the number and message filled in. - QrCode::SMS('555-555-5555', 'Corpo del messaggio.'); - -#### WiFi - -Questo helper crea codici Qr scansionabili che permettono la connessione del telefono ad una determinata rete WiFi. - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID della rete', - 'password' => 'Password della rete', - 'hidden' => 'Whether the network is a hidden SSID or not.' - ]); - - //Connects to an open WiFi network. - QrCode::wiFi([ - 'ssid' => 'Nome Rete', - ]); - - //Connects to an open, hidden WiFi network. - QrCode::wiFi([ - 'ssid' => 'Nome Rete', - 'hidden' => 'true' - ]); - - //Connects to an secured, WiFi network. - QrCode::wiFi([ - 'ssid' => 'Nome Rete', - 'encryption' => 'WPA', - 'password' => 'miaPassword' - ]); - ->La scansione WiFi non è al momento supportata sui dispositivi Apple. - - -##Uso generico dei QrCode - -Puoi utilizzare un prefisso della tabella sottostante per generare dei codici Qr in grado di contenere maggiori informazioni: - - QrCode::generate('http://www.simplesoftware.io'); - - -| Usage | Prefix | Example | -| --- | --- | --- | -| Website URL | http:// | http://www.simplesoftware.io | -| Secured URL | https:// | https://www.simplesoftware.io | -| E-mail Address | mailto: | mailto:support@simplesoftware.io | -| Phone Number | tel: | tel:555-555-5555 | -| Text (SMS) | sms: | sms:555-555-5555 | -| Text (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | -| Text (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | -| Geo Address | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | -| Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -##Uso al di fuori di Laravel - -Puoi usare questo package al di fuori di Laravel istanziando una nuova classe `BaconQrCodeGenerator`. - - use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; - - $qrcode = new BaconQrCodeGenerator; - $qrcode->size(500)->generate('Crea un QrCode senza Laravel!'); diff --git a/docs/ja/README.md b/docs/ja/README.md deleted file mode 100644 index 8ace763..0000000 --- a/docs/ja/README.md +++ /dev/null @@ -1,436 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - -#### [Deutsch](http://www.simplesoftware.io/#/docs/simple-qrcode/de) | [Español](http://www.simplesoftware.io/#/docs/simple-qrcode/es) | [Français](http://www.simplesoftware.io/#/docs/simple-qrcode/fr) | [Italiano](http://www.simplesoftware.io/#/docs/simple-qrcode/it) | [Português](http://www.simplesoftware.io/#/docs/simple-qrcode/pt-br) | [Русский](http://www.simplesoftware.io/#/docs/simple-qrcode/ru) | [日本語](http://www.simplesoftware.io/#/docs/simple-qrcode/ja) | [한국어](http://www.simplesoftware.io/#/docs/simple-qrcode/kr) | [हिंदी](http://www.simplesoftware.io/#/docs/simple-qrcode/hi) | [简体中文](http://www.simplesoftware.io/#/docs/simple-qrcode/zh-cn) | [العربية](https://www.simplesoftware.io/#/docs/simple-qrcode/ar) - -- [イントロダクション](#docs-introduction) -- [アップグレードガイド](#docs-upgrade) -- [翻訳](#docs-translations) -- [設定](#docs-configuration) -- [簡単な使い方](#docs-ideas) -- [使い方](#docs-usage) -- [ヘルパー](#docs-helpers) -- [よくあるQRコードの利用方法](#docs-common-usage) -- [Laravel外での使い方](#docs-outside-laravel) - - -## イントロダクション -Simple QrCode は [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode) を元に作られた 人気のあるLaravelフレームワークで簡単に使う事のできるラッパーです。Laravelユーザーになじみのある使い方ができるように開発されました。 - -![Example 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-1.png?raw=true) ![Example 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-2.png?raw=true) - - -## 翻訳 -この文書の翻訳を手伝ってくれるアラビア語、スペイン語、フランス語、韓国語、日本語を話すユーザーを探しています。 翻訳が可能な場合はプルリクエストを作成してください。 - -We are looking for users who speak Arabic, Spanish, French, Korean or Japanese to help translate this document. Please create a pull request if you are able to make a translation! - - -## アップグレード - -v2とv3からのアップデートは、`composer.json`ファイル内のバージョン指定を`~4`に変更してください。 - -PNG形式の画像を生成する場合は、**必ず**`imagick` PHP拡張をインストールしてください。 - -#### v4 - -> 4.1.0を作成するときのミスで、後方互換性が失われる変更がmasterブランチに入りました。 -> `generate`メソッドは現在は `Illuminate\Support\HtmlString` のインスタンスを返します。 -> 詳細は https://github.com/SimpleSoftwareIO/simple-qrcode/issues/205 を参照してください。 - -v3での読み込みに関する問題を引き起こすLaravelファサードの問題がありました。 -この問題を解決するためには、後方互換性が失われる変更を加える必要があり、v4がリリースされるに至った経緯があります。 -v2からのアップグレードの場合は既存コードの変更は必要ありません。 -以下の説明はv3ユーザー向けです。 - -全ての`QrCode`ファサードへの参照は以下のように変更する必要があります: - -``` -use SimpleSoftwareIO\QrCode\Facades\QrCode; -``` - - -## 設定 - -#### Composer - -`composer require simplesoftwareio/simple-qrcode "~4"` を実行してパッケージを追加します。 - -Laravelが自動的に必要なパッケージをインストールします。 - - -## 簡単な使い方 - -#### 画面に表示する - -このパッケージの主なアイテムは 画面に表示する機能です。 -カスタマーはコードをスキャンするだけで 画面に戻ることが出来ます。以下の内容を footer.blade.php に追加しました。 - -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

スキャンして元のページに戻ります

-
- -#### QRコードを埋め込む - -ユーザーがすばやくスキャンできるように、電子メールの中にQRコードを埋め込むことができます。 以下はLaravelでこれを行う方法の例です。 - - // Bladeテンプレート内で以下のように書きます - - - -## 使い方 - -#### 基本的な使い方 - -使い方はとても簡単です。 最も基本的な構文は次のとおりです。 - - QrCode::generate('Make me into a QrCode!'); - -これで「Make me into a QrCode!」というQRコードが作成されます。 - -![QRコード生成例](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/make-me-into-a-qrcode.png?raw=true) - -#### 生成する - -`generate`はQRコードを生成するのに使われます。 - - QrCode::generate('Make me into a QrCode!'); - ->要注意: チェーン内で使用する場合は、このメソッドを最後に呼び出す必要があります。 - -`generate`はデフォルトで SVG イメージ文字列を返します。 -Laravel Blade に以下の様に書くことで モダンなブラウザに表示することができます。 - - {!! QrCode::generate('Make me into a QrCode!'); !!} - -`generate`メソッドの第二引数はQrCodeを保存するパスとファイルネームです。 - - QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); - -#### フォーマットを変える `(string$ format)` - ->QrCode Generator のデフォルトフォーマットはSVGイメージです。 - ->要注意: `format`メソッドは` size`、 `color`、` backgroundColor`、 `margin`のような他のフォーマットオプションの前に呼ばれなければなりません。 - -現在PNG、EPS、およびSVGの 3つのフォーマットがサポートされています。 -フォーマットを変更するには、次のコードを使用します。 - - QrCode::format('png'); //Will return a PNG image - QrCode::format('eps'); //Will return a EPS image - QrCode::format('svg'); //Will return a SVG image - -#### サイズの変更 `(int $size)` - ->QrCode GeneratorはデフォルトでQRコードを作成するためにピクセルで可能な最小サイズを返します。 - -`size`メソッドを使うことでQrCodeのサイズを変えることができます。 次の構文を使用して、必要なサイズをピクセル単位で指定します。 - - QrCode::size(100); - -#### 色の変更 `(int $red, int $green, int $blue, int $alpha = null)` - ->要注意 色を変えるときには注意してください。QrCodeの読み込みが難しくなる 色が有ります。 - -すべての色はRGB (Red Green Blue)で表現する必要があります。 次のようにしてQrCodeの色を変更できます: - - QrCode::color(255,0,255); - -背景色の変更もサポートされており、同じ方法で表現できます。 - - QrCode::backgroundColor(255,255,0); - -#### 背景色の変更 `(int $red, int $green, int $blue, int $alpha = null)` - -`backgroudColor`メソッドを呼び出すことでQRコードの背景色を変更できます。 - - QrCode::backgroundColor(255, 0, 0); // 赤が背景色のQRコード - QrCode::backgroundColor(255, 0, 0, 25); // 透明度25%で赤が背景色のQRコード - -![赤が背景色のQRコード](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-background.png?raw=true) ![赤が背景色で透過なQRコード](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent-background.png?raw=true) - -#### グラデーション `(int $startRed, int $startGreen, int $startBlue, int $endRed, int $endGreen, int $endBlue, string $type)` - -`gradient`メソッドを呼び出すことでQRコードにグラデーションを適用することができます。 - -以下のグラデーションタイプがサポートされています: - -| タイプ | 例 | -|--------------------|--------------------------------------------------------------------------------------------------------------------------------------| -| `vertical` | ![Vertical](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/vertical.png?raw=true) | -| `horizontal` | ![Horizontal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/horizontal.png?raw=true) | -| `diagonal` | ![Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/diagonal.png?raw=true) | -| `inverse_diagonal` | ![Inverse Diagonal](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/inverse_diagonal.png?raw=true) | -| `radial` | ![Radial](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/radial.png?raw=true) | - -#### 切り出しシンボル色 `(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0)` - -`eyeColor`メソッドを呼び出すことで切り出しシンボルの色を変更することもできます。 - - QrCode::eyeColor(0, 255, 255, 255, 0, 0, 0); // シンボル番号`0`の色を変更します - -| シンボル番号 | 例 | -|--------|-----------------------------------------------------------------------------------------------------------------| -| `0` | ![Eye 0](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-0.png?raw=true) | -| `1` | ![Eye 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-1.png?raw=true) | -| `2` | ![Eye 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-2.png?raw=true) | - - -#### スタイル `(string $style, float $size = 0.5)` - -ブロックのスタイルは`style`メソッドを使用して`square`、`dot`、`round`に変更できます。 -これはQRコードの内部のブロックを変更します。 -2つめのパラメーターは`dot`と`round`の大きさを指定します。 - - QrCode::style('dot'); // `dot`スタイルに変更 - -| スタイル | 例 | -|----------|----------------------------------------------------------------------------------------------------------------------| -| `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `dot` | ![Dot](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/dot.png) | -| `round` | ![Round](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/round.png?raw=true) | - -#### 切り出しシンボルのスタイル `(string $style)` - -切り出しシンボルのスタイルは`eye`メソッドを使用して`square`、`circle`に変更できます。 - - QrCode::eye('circle'); // `circle`スタイルの切り出しシンボルに変更 - -| スタイル | 例 | -|----------|----------------------------------------------------------------------------------------------------------------------| -| `square` | ![Square](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `circle` | ![Circle](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/circle-eye.png?raw=true) | - -#### マージンの変更 `(int $margin)` - -QRコード周辺のマージンを変更する機能もサポートされています。 次の構文を使用してマージンを指定します: - - QrCode::margin(100); - -#### エラー訂正 `(string $errorCorrection)` - -エラー訂正レベルの変更は簡単です。次のようにします: - - QrCode::errorCorrection('H'); - -`errorCorrection` メソッドによってサポートされているオプション値は以下の通りです: - -| エラー訂正レベル | 補償できる誤りの割合 | -|----------|------------------| -| L | 7% までの誤りが復元できます | -| M | 15% までの誤りが復元できます | -| Q | 25% までの誤りが復元できます | -| H | 30% までの誤りが復元できます | - -> より高いエラー訂正レベルを使用すると、QRコードの大きさはより大きくなり、格納できるデータ量は少なくなります。詳しくは [エラー訂正(リンク先は英語です)](http://en.wikipedia.org/wiki/QR_code#Error_correction) をご覧ください。 - -#### 文字コード `(string $encoding)` - -QRコードの生成に使われる文字コードを変更します。デフォルトでは`ISO-8859-1`が指定されています。 -詳細は [文字コード](https://ja.wikipedia.org/wiki/%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89) をお読みください。 - -以下のようにして文字コードを変更できます: - - QrCode::encoding('UTF-8')->generate('日本語や特殊な文字を含むQRコードも作れます♠♥!!'); - -| 文字コード | -|--------------| -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - -#### 重ね合わせ `(string $filepath, float $percentage = .2, bool $absolute = false)` - -`merge`メソッドはQRコードの上に画像を重ね合わせます。この機能は主にQRコードの中にロゴなどを配置する目的で使われます。 - - //中央に画像を配置したQRコードを生成します - QrCode::format('png')->merge('path-to-image.png')->generate(); - - //中央に画像を配置したQRコードを生成します。配置された画像は最大でQRコードの大きさの30%になります。 - QrCode::format('png')->merge('path-to-image.png', .3)->generate(); - - //中央に画像を配置したQRコードを生成します。配置された画像は最大でQRコードの大きさの30%になります。 - QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); - -> `merge`メソッドは現在のところPNGファイルのみをサポートしています。 -> 引数`$absolute`が`false`の場合はファイルパスはプロジェクトルートからの相対パスとして認識されます。絶対パスで指定する場合は`true`を指定してください。 - -> `merge`メソッドを使用して画像を重ねているときでもQRコードを読み取れるようにするために、エラー訂正レベルも高くするべきです。`errorCorrection('H')`の使用を推奨します。 - -![ロゴを重ねた状態のサンプル](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### バイナリ文字列による重ね合わせ `(string $content, float $percentage = .2)` - -`mergeString`メソッドは、ファイルを指定する代わりにバイナリ文字列を受け取る点を除いては`merge`メソッドと同様の挙動になります。 - - // 中央に画像を配置したQRコードを生成します - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); - - // 中央に画像を配置したQRコードを生成します。配置された画像は最大でQRコードの大きさの30%になります。 - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); - -> `merge`メソッドと同様に、現時点ではPNG形式のみサポートしています。エラー訂正についても同様にHレベルを推奨します。 - -#### 一歩進んだ使い方 - -全てのメソッドはチェーン呼び出しをサポートしています。`generate`メソッドは必ず最後に呼び出されなければいけません。例えば以下のようになります: - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); - -そのままのバイナリ文字列と`base64_encode`によるエンコーディングを組み合わせて、PNG画像をファイルとして保存することなく直接表示することもできます。 - - - - -## ヘルパー - -#### ヘルパーとは - -ヘルパーは読み込み時に特定のアクションを実行するQRコードを簡単に生成するための機能です。 - -#### ビットコイン - -このヘルパーはビットコインの支払用QRコードを生成します。[詳細情報(リンク先は英語です)](https://bitco.in/en/developer-guide#plain-text) - - QrCode::BTC($address, $amount); - - // 0.334BTCを指定したアドレスに送金 - QrCode::BTC('bitcoin address', 0.334); - - // いくつかのオプションを付けて0.334BTCを指定したアドレスに送金 - QrCode::size(500)->BTC('address', 0.0034, [ - 'label' => 'my label', - 'message' => 'my message', - 'returnAddress' => 'https://www.returnaddress.com' - ]); - -#### Eメール - -このヘルパーはEメールアドレス、件名、本文を指定してメールを送信するQRコードを生成します。 - - QrCode::email($to, $subject, $body); - - // アドレスを指定します - QrCode::email('foo@bar.com'); - - // アドレス、件名、本文を指定します - QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); - - // メールの件名と本文のみを指定します - QrCode::email(null, 'This is the subject.', 'This is the message body.'); - -#### 位置情報 - -このヘルパーは緯度と経度を指定してGoogleマップなどの地図アプリを開くQRコードを生成します。 - - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -#### 電話番号 - -このヘルパーは読み取ったときに電話をかけるQRコードを生成します。 - - QrCode::phoneNumber($phoneNumber); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### SMS - -このヘルパーは送信先と本文を指定してSMSメッセージを作成するQRコードを生成します。 - - QrCode::SMS($phoneNumber, $message); - - // 電話番号が入力済みの状態でSMSメッセージを作成します - QrCode::SMS('555-555-5555'); - - // 電話番号と本文が入力済みの状態でSMSメッセージを作成します - QrCode::SMS('555-555-5555', 'Body of the message'); - -#### Wi-Fi - -このヘルパーはWi-Fiの接続情報を自動入力するQRコードを生成します。 - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID of the network', - 'password' => 'Password of the network', - 'hidden' => 'Whether the network is a hidden SSID or not.' - ]); - - // Wi-Fiのオープンネットワークに接続します - QrCode::wiFi([ - 'ssid' => 'Network Name', - ]); - - // SSIDの公開されていないオープンネットワークに接続します - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'hidden' => 'true' - ]); - - // 暗号化されたWi-Fiネットワーク接続します - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'encryption' => 'WPA', - 'password' => 'myPassword' - ]); - -> Wi-Fi接続情報のQRコードは現在のところApple社の製品ではサポートされていません。 - - -## よくあるQRコードの利用方法 - -`generate`メソッドに渡す文字列にプレフィックスを付けることで、様々なQRコードを生成できます。 - - QrCode::generate('http://www.simplesoftware.io'); - - -| 利用方法 | プレフィックス | 例 | -|-----------------|-------------|----------------------------------------------------------------------------------------------------------| -| ウェブサイトURL | http:// | http://www.simplesoftware.io | -| 暗号化されたウェブサイトURL | https:// | https://www.simplesoftware.io | -| Eメールアドレス | mailto: | mailto:support@simplesoftware.io | -| 電話番号 | tel: | tel:555-555-5555 | -| SMS | sms: | sms:555-555-5555 | -| 本文入力済みSMS | sms: | sms::入力済みメッセージ | -| 本文・宛先入力済みSMS | sms: | sms:555-555-5555:入力済みメッセージ | -| 位置情報 | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [例(リンク先は英語です)](https://en.wikipedia.org/wiki/VCard) | -| Wi-Fi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -## Laravel外での使い方 - -このパッケージは`Generater`クラスをインスタンス化することで、Laravelの外でも使えます。 - - use SimpleSoftwareIO\QrCode\Generator; - - $qrcode = new Generator; - $qrcode->size(500)->generate('Make a qrcode without Laravel!'); diff --git a/docs/kr/README.md b/docs/kr/README.md deleted file mode 100644 index c579fbc..0000000 --- a/docs/kr/README.md +++ /dev/null @@ -1,358 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - -- [소개(Introduction)](#docs-introduction) -- [번역(Translations)](#docs-translations) -- [설정(Configuration)](#docs-configuration) -- [간단한 아이디어(Simple Ideas)](#docs-ideas) -- [사용법(Usage)](#docs-usage) -- [헬퍼(Helpers)](#docs-helpers) -- [사용 예시(Common QrCode Usage)](#docs-common-usage) -- [라라벨을 사용하지 않는 곳에서 사용하기(Usage Outside of Laravel)](#docs-outside-laravel) - - -## 소개(Introduction) -Simple QrCode는 인기가 많은 라라벨 프레임워크 상에서 쉽게 사용할 수 있는 Qr코드 생성 패키지로, 정말 잘 만들어진 [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode)를 기반으로 만들어졌습니다. 우리는 라라벨을 이용하는 사람들에게 친숙하고 쉬운 인터페이스를 만들었습니다. - - -## 번역(Translations) -우리는 현재 이 문서의 번역을 도와줄 아랍어, 스페인어, 불어, 혹은 일본어를 할 줄 아는 사람을 찾고 있습니다. 만약 번역을 해주실 수 있다면, 풀리퀘스트(Pull request)를 보내주세요! - - -## 설정(Configuration) - -#### Composer - -우선, Simple QrCode 패키지를 `composer.json` 파일의 `require`에 추가해주세요: - - "require": { - "simplesoftwareio/simple-qrcode": "~2" - } - -그 다음으로, `composer update` 명령을 실행해주세요. - -#### Service Provider - -###### Laravel <= 5.4 -`config/app.php`의 `providers` 배열 안에, `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class`를 등록해주세요. - -#### Aliases - -###### Laravel <= 5.4 -마지막으로, `config/app.php` 설정 파일의 `aliases` 배열 안에, `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class`를 등록해주세요. - - -## 간단한 아이디어(Simple Ideas) - -#### 화면에 출력하기 - -이 패키지를 사용하는 핵심적인 이유 중 하나는 Qr코드를 화면에 출력하기 위함입니다. 이 패키지는 우리의 고객들이 Qr코드를 스캔하는 것만으로 원래의 페이지로 돌아가게 할 수 있습니다. 우리는 이를 footer.blade.php 파일에 아래의 코드를 추가함으로서 해냈습니다. - -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

Scan me to return to the original page.

-
- -#### Qr코드 Embed하기 - -Qr코드를 이메일에 embed함으로서 유저가 쉽고 빠르게 스캔할 수 있게 할 수도 있습니다. 아래의 코드는 라라벨에서의 예시입니다. - - //Inside of a blade template. - - - -## 사용법(Usage) - -#### 간단한(Basic) 사용법 - -Qr코드를 생성하는 방법은 정말 쉽습니다. 가장 간단한 구문은: - - QrCode::generate('Make me into a QrCode!'); - -위 코드는 "Make me into a QrCode!"라는 문장을 Qr코드로 만들어줍니다. - -#### 생성(Generate) - -`Generate`는 Qr코드를 만들기 위해 사용됩니다. - - QrCode::generate('Make me into a QrCode!'); - ->주의하세요! 만약 메소드 체이닝을 사용하신다면, 이 메소드는 마지막에 호출되어야 합니다. - -기본적인 `Generate`는 SVG 이미지 문자열을 반환합니다. 라라벨의 Blade를 사용하시면, 현대의 브라우저에는 직접적으로 출력하실 수 있습니다. 아래의 코드를 참고하세요: - - {!! QrCode::generate('Make me into a QrCode!'); !!} - -`generate` 메소드의 두 번째 인자는 Qr코드를 저장할 파일명과 경로입니다. - - QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); - -#### 포맷(Format) 변경 - ->Qr코드를 생성하면 기본적으로 SVG 이미지가 반환됩니다. - ->주의하세요! `format` 메소드는 `size`, `color`, `backgroundColor`, 그리고 `margin`과 같은 다른 포맷팅 옵션들보다 먼저 호출되어야 합니다. - -현재는 PNG, EPS, 그리고 SVG 이 세 가지 포맷을 지원하고 있습니다. 포맷을 변경하려면 아래의 코드를 참고하세요: - - QrCode::format('png'); //Will return a PNG image - QrCode::format('eps'); //Will return a EPS image - QrCode::format('svg'); //Will return a SVG image - -#### 크기 변경 - ->Qr코드를 생성하면 기본적으로 Qr코드를 만들기 위한 최소 픽셀 사이즈로 반환됩니다. - -`size` 메소드를 사용하면 Qr코드의 크기를 변경할 수 있습니다. 아래의 코드처럼, 단순히 원하는 픽셀 사이즈를 입력하세요: - - QrCode::size(100); - -#### 색 변경 - ->Qr코드의 색을 변경할 때는 주의하세요. 어떤 Qr리더들은 색이 입혀진 Qr코드를 잘 읽지 못합니다. - -모든 색은 RGB (Red Green Blue)로 표현되어야 합니다. 아래의 코드와 같이 Qr코드의 색을 변경할 수 있습니다: - - QrCode::color(255,0,255); - -배경색도 변경할 수 있고, 같은 표현 방법을 사용합니다. - - QrCode::backgroundColor(255,255,0); - -#### 여백(Margin) 변경 - -Qr코드 주위의 여백을 변경하는 것 또한 가능합니다. 아래의 코드처럼, 단순히 원하는 여백을 입력하세요: - - QrCode::margin(100); - -#### 오류 복원(Error Correction) - -오류 복원 레벨을 변경하는 것은 쉽습니다. 아래의 코드를 참고하세요: - - QrCode::errorCorrection('H'); - -아래는 `errorCorrection` 메소드에서 지원하는 옵션들입니다. - -| 오류 복원 레벨 | 복원률 | -| --- | --- | -| L | 약 7%의 codewords | -| M | 약 15%의 codewords | -| Q | 약 25%의 codewords | -| H | 약 30%의 codewords | - ->codewords는 데이터를 구성하는 단위로 Qr코드에는 8bit/codewords를 의미합니다. - ->복원율이 커질 수록 Qr코드가 커지고 저장할 수 있는 데이터가 적어집니다. [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction)를 참고하세요. - -#### 인코딩(Encoding) - -Qr코드를 만들기 위한 문자 인코딩을 변경할 수 있습니다. 기본값은 `ISO-8859-1`입니다. [character encoding](http://en.wikipedia.org/wiki/Character_encoding)를 참고하세요. 아래의 코드처럼, 다른 인코딩으로 변경할 수 있습니다: - - QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); - -| 문자 인코더(Character Encoder) | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - ->`Could not encode content to ISO-8859-1` 오류는 잘못된 문자 인코딩이 사용되고 있다는 것을 의미합니다. 만약 확신이 없다면 `UTF-8` 사용을 권장합니다. - -#### 병합(Merge) - -`merge` 메소드는 이미지를 Qr코드 위에 합쳐줍니다. 주로 로고 이미지를 Qr코드 안에 넣기 위해 사용합니다. - - QrCode::merge($filename, $percentage, $absolute); - - //Generates a QrCode with an image centered in the middle. - QrCode::format('png')->merge('path-to-image.png')->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->merge('path-to-image.png', .3)->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); - ->`merge` 메소드는 현재 PNG 포맷만 지원합니다. ->`$absolute`가 `false`로 되어 있으면, 파일 경로는 상대 경로입니다. 절대 경로를 사용하고 싶으시면, 이 변수 값을 `true`로 변경해주세요. - ->`merge`를 사용하면서 Qr리더가 잘 스캔하게 하기 위해서는 높은 오류 복원율을 사용해야합니다. `errorCorrection('H')`를 사용하기를 권장합니다. - -![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### 이진 문자열 병합(Merge Binary String) - -`mergeString` 메소드는 `merge`와 동일한 동작을 합니다. 단, `mergeString` 메소드를 사용하면 파일을 파일의 경로가 아닌 문자열로 표현할 수 있도록 해줍니다. 이는 `Storage` 파사드를 같이 사용할 때, 유용하게 쓰입니다. `mergeString`의 인터페이스는 `merge`와 거의 동일합니다. - - QrCode::mergeString(Storage::get('path/to/image.png'), $percentage); - - //Generates a QrCode with an image centered in the middle. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); - - //Generates a QrCode with an image centered in the middle. The inserted image takes up 30% of the QrCode. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); - ->일반적인 `merge` 메소드 호출처럼, 현재 PNG 포맷만 지원합니다. 오류 복원율도 동일하게 높은 레벨의 오류 복원율을 권장합니다. - -#### 고급(Advanced) 사용법 - -모든 메소드는 메소드 체이닝을 지원합니다. `generate` 메소드는 반드시 마지막에 호출되어야 하고, `format` 변경은 반드시 첫 부분에 호출되어야 합니다. 아래의 예시 코드를 참고해주세요: - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); - -PNG 이미지를 `base64_encode`를 사용하여 인코딩된 raw string을 사용하면, 파일로 저장하지 않아도 출력할 수 있습니다. - - - - -## 헬퍼(Helpers) - -#### 헬퍼가 무엇인가요? - -헬퍼는 Qr리더로 스캔했을 때, 특정한 동작을 할 수 있는 Qr코드를 만들어줍니다. - -#### 비트코인(BitCoin) - -이 헬퍼는 스캔했을 때 비트코인을 송금할 수 있는 Qr코드를 만들어줍니다. [더 알아보기](https://bitco.in/en/developer-guide#plain-text) - - QrCode::BTC($address, $amount); - - //Sends a 0.334BTC payment to the address - QrCode::BTC('bitcoin address', 0.334); - - //Sends a 0.334BTC payment to the address with some optional arguments - QrCode::size(500)->BTC('address', 0.0034, [ - 'label' => 'my label', - 'message' => 'my message', - 'returnAddress' => 'https://www.returnaddress.com' - ]); - -#### 이메일(E-mail) - -이 헬퍼는 이메일 주소, 제목, 그리고 내용이 미리 입력되어 있는 채로 이메일을 보낼 수 있는 Qr코드를 만들어줍니다. - - QrCode::email($to, $subject, $body); - - //Fills in the to address - QrCode::email('foo@bar.com'); - - //Fills in the to address, subject, and body of an e-mail. - QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); - - //Fills in just the subject and body of an e-mail. - QrCode::email(null, 'This is the subject.', 'This is the message body.'); - -#### 지리위치(Geo) - -이 헬퍼는 스마트폰으로 스캔해서 구글 지도 같은 지도 앱들에 위치를 표현할 수 있도록 위도와 경도 값을 포함하고 있는 Qr코드를 만들어줍니다. - - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -#### 전화번호(Phone Number) - -이 헬퍼는 스캔해서 통화 연결을 할 수 있는 Qr코드를 만들어줍니다. - - QrCode::phoneNumber($phoneNumber); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### 문자 메세지(SMS) - -이 헬퍼는 받는 사람 번호와 문자 메세지 내용이 미리 입력되어 있는 채로 문자 메세지를 보낼 수 있는 Qr코드를 만들어줍니다. - - QrCode::SMS($phoneNumber, $message); - - //Creates a text message with the number filled in. - QrCode::SMS('555-555-5555'); - - //Creates a text message with the number and message filled in. - QrCode::SMS('555-555-5555', 'Body of the message'); - -#### 와이파이(WiFi) - -이 헬퍼는 스마트폰으로 스캔해서 와이파이에 연결할 수 있도록 하는 Qr코드를 만들어줍니다. - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID of the network', - 'password' => 'Password of the network', - 'hidden' => 'Whether the network is a hidden SSID or not.' - ]); - - //Connects to an open WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - ]); - - //Connects to an open, hidden WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'hidden' => 'true' - ]); - - //Connects to an secured, WiFi network. - QrCode::wiFi([ - 'ssid' => 'Network Name', - 'encryption' => 'WPA', - 'password' => 'myPassword' - ]); - ->현재 애플 제품(예. 아이폰 등)은 와이파이 스캔을 지원하지 않습니다. - - -## 사용 예시(Common QrCode Usage) - -아래 표에 있는 접두사(prefix)를 `generate` 섹션에 사용하면, 더 고급스러운 정보가 저장된 Qr코드를 만들 수 있습니다: - - QrCode::generate('http://www.simplesoftware.io'); - - -| 사용처 | Prefix | 예시 | -| --- | --- | --- | -| 웹사이트(http) URL | http:// | http://www.simplesoftware.io | -| 웹사이트(https) URL | https:// | https://www.simplesoftware.io | -| 이메일 주소 | mailto: | mailto:support@simplesoftware.io | -| 전화번호 | tel: | tel:555-555-5555 | -| 문자 메세지(SMS) | sms: | sms:555-555-5555 | -| 내용이 미리 입력된 문자 메세지(SMS) | sms: | sms::I am a pretyped message | -| 번호와 내용이 미리 입력된 문자 메세지(SMS) | sms: | sms:555-555-5555:I am a pretyped message | -| 지리위치 정보(Geo Address) | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [See Examples](https://en.wikipedia.org/wiki/VCard) | -| 와이파이(Wifi) | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -## 라라벨을 사용하지 않는 곳에서 사용하기(Usage Outside of Laravel) - -`BaconQrCodeGenerator` 클래스를 인스턴스화하면, 라라벨을 사용하지 않는 곳에서 이 패키지를 사용할 수 있습니다. - - use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; - - $qrcode = new BaconQrCodeGenerator; - $qrcode->size(500)->generate('Make a qrcode without Laravel!'); diff --git a/docs/pt-br/README.md b/docs/pt-br/README.md deleted file mode 100644 index 11dba0c..0000000 --- a/docs/pt-br/README.md +++ /dev/null @@ -1,341 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - - -- [Introdução](#docs-introduction) -- [Traduções](#docs-translations) -- [Configuração](#docs-configuration) -- [Simples ideias](#docs-ideas) -- [Uso](#docs-usage) -- [Ajuda](#docs-ajudantes) -- [Uso comum do QrCode](#docs-common-usage) -- [Uso sem Laravel](#docs-outside-laravel) - - -## Introdução -Simple QrCode é um pacote de fácil uso do Framework Laravel, baseado no grande trabalho do [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). Criamos uma interface que é fácil e familiar de instalar para usuários Laravel. - - -## Traduções - Estamos procurando por usuários que falem Árabe, Espanhol, Francês, Coreano ou Japonês, para nos ajudar a traduzir este documento. Por favor, crie um pull request se você é capar de fazer uma tradução! - - -## Configuração - -#### Composer - -Primeiramente, adicione o pacote Simple QrCode ao seu `require` no arquivo `composer.json`: - - "require": { - "simplesoftwareio/simple-qrcode": "~2" - } - -Em seguida, execute o comando `composer update`. - -#### Provedor de Serviço - -###### Laravel <= 5.4 -Registre a `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` em seu `config/app.php` dentro do array `providers`. - -#### Aliases - -###### Laravel <= 5.4 -Finalmente, adicione `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` em seu arquivo de configuração `config/app.php` dentro do array `aliases`. - - -## Ideias simples - -#### Print View - -Um dos principais pontos pelo qual nós utilizamos este pacote para é ter QRCodes em todos os nossos pontos de vista de impressão. Isto permite que nossos clientes possam retornar para a página original depois da impressão, basta digitalizar o código. Conseguimos isso adicionando o seguinte em nosso arquivo footer.blade.php. - -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

Me escaneie para retornar à página principal

-
- -#### Embarcando um QrCode - -Você pode incorporar um qrcode dentro de um e-mail, que permita que seus usuários escaneiem rapidamente. Abaixo, um exemplo de como fazer isso utilizando o Laravel. - - //Inside of a blade template. - - - -## Uso - -#### Uso Básico - -É muito fácil utilizar o gerador de Qrcode. A sintaxe mais básica é: - - QrCode::generate('Me transforme em um QrCode!'); - -Isso criará um Qr que diz "Me transforme em um QrCode!" - -#### Generate - -`Generate` é usado para criar o QrCode. - - QrCode::generate('Me transforme em um QrCode!'); - ->Atenção! Esse método deve ser chamado por último dentro da cadeia. - -`Generate` por padrão irá retornar uma string de imagem SVG. Você pode exibir diretamente em seu browser, utilizando o Laravel's Blade com o código abaixo: - - {!! QrCode::generate('Me transforme em um QrCode!'); !!} - -O método `generate` tem um segundo parametro que aceita um arquivo e um path para salvar o Qrcode. - - QrCode::generate('Me transforme em um QrCode!', '../public/qrcodes/qrcode.svg'); - -#### Alteração de Formato - ->Por padrão o gerador de QrCode está configurado para retornar uma imagem SVG. - ->Cuidao! O método `format` deve ser chamado antes de qualquer outra opção de formatação como `size`, `color`, `backgroundColor` e `margin`. - -Atualmente são suportados três tipos de formatos; PNG, EPS, and SVG. Para alterar o formato, use o seguinte código: - - QrCode::format('png'); // Retornará uma imagem no formato PNG - QrCode::format('eps'); // Retornará uma imagem no formato EPS - QrCode::format('svg'); // Retornará uma imagem no formato SVG - -#### Alteração de Tamanho - ->Por padrão, o gerador QrCode retornará o menos tamanho possível em pixels para criar o QrCode. - -Você pode alterar o tamanho do QrCode usando o método `size`. Simplesmente especifique o tamanho desejado em pixels usando a seguinte sintaze: - - QrCode::size(100); - -#### Alteração de cor - ->Cuidado quando estiver alterando a cor de um QRCode. Alguns leitores tem uma grande dificuldade em ler QrCodes coloridos. - -Todas as cores devem ser definidas em RGB(Red Green Blue). Você pode alterar a cor de um qrCode usando o código abaixo: - - QrCode::color(255,0,255); - -Alterações do plano de fundo também são suportadas e definidas da mesma maneira. - - QrCode::backgroundColor(255,255,0); - -#### Alteração de Margem - -A capacidade de alterar a margem ao redor do QrCode também é suportada. Simplesmente especifique o tamanho desejado da margem, utilizando a sintaxe abaixo: - - QrCode::margin(100); - -#### Correção de erros - -Alterar o nível de correção de erros é simples. Utilize a seguinte sintaxe: - - QrCode::errorCorrection('H'); - -As seguintes opções são suportadas para o método `errorCorrection`. - -| Correção de erros | Garantia fornecida | -| --- | --- | -| L | 7% das palavras-código podem ser restauradas. | -| M | 15% das palavras-código podem ser restauradas. | -| Q | 25% das palavras-código podem ser restauradas. | -| H | 30% das palavras-código podem ser restauradas. | - ->Quanto maior a correção de erros utilizada, maior o QrCode fica e menos informação ele pode armazenar. Leia mais sobre [correção de erros](http://en.wikipedia.org/wiki/QR_code#Error_correction). - -#### Codificação - -Alterar a codificação que é usada para criar um QrCode. Por padrão, a encodificação padrão é a `ISO-8859-1`. Leia mais sobre [codificação de caracteres](https://pt.wikipedia.org/wiki/Codifica%C3%A7%C3%A3o_de_caracteres). Você pode alterar a codificação usando o seguinte código: - - QrCode::encoding('UTF-8')->generate('Faça-me um QrCode com símbolos especiais ♠♥!!'); - -| Codificador de caracteres | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - ->Um erro de `Could not encode content to ISO-8859-1` significa que foi inserido algum caractere inválido. Recomendamos o `UTF-8` se você não tiver certeza. - -#### Mesclar - -O método `merge` mescla uma imagem sobre um Qrcode. É comumente usado para se colocar logos dentro de um QrCode. - - QrCode::merge($filename, $percentage, $absolute); - - // Gera um QrCode com uma imagem centralizada. - QrCode::format('png')->merge('diretório/da/imagem.png')->generate(); - - // Gera um QrCode com uma imagem centralizada. A imagem inserida ocupará 30% do QrCode. - QrCode::format('png')->merge('diretório/da/imagem.png', .3)->generate(); - - // Gera um QrCode com uma imagem centralizada. A imagem inserida ocupará 30% do QrCode. - QrCode::format('png')->merge('http://www.google.com/algumaImagem.png', .3, true)->generate(); - ->O método `merge` suporta somente arquivos do tipo PNG. ->O diretório da imagem é relativo ao caminho base da aplicação, se o `$absolute` estiver setada para `false`. Altere essa variável para `true` para usar caminhos absolutos. - ->Você deve usar um alto nível de correção de erros quando usado o método `merge`, para garantir que o QrCode será legível. Recomendamos usar `errorCorrection('H')`. - -![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### Funda string binária - -O método `mergeString` pode ser usado para alcançar a mesma chamada do método `merge`, exceto que ele permite que você represente uma string de um arquivo ao invés do diretório. Isso é útil quando é utilizado o padrão `Storage`. A chamada a essa interface é bastante similar ao método `merge`. - - QrCode::mergeString(Storage::get('diretório/da/imagem.png'), $percentage); - - // Gera um QrCode com uma imagem centralizada. - QrCode::format('png')->mergeString(Storage::get('diretório/da/imagem.png'))->generate(); - - // Gera um QrCode com uma imagem centralizada. A imagem inserida ocupará 30% do QrCode. - QrCode::format('png')->mergeString(Storage::get('diretório/da/imagem.png'), .3)->generate(); - ->Assim como o método `merge`, somente arquivos do tipo PNG são suportados. O mesmo aplica-se para correção de erros, altos níveis são recomendados. - -#### Uso Avançado - -Todos os métodos suportam encadeamento. O método `generate` deve ser chamado por último e o método `format` deve ser chamado primeiro. Por exemplo, vocẽ pode executar o código seguinte: - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Faça-me um QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Faça-me um QrCode!'); - -Você pode exibir uma imagem PNG, sem salvar o arquivo e prover uma string encodificada pelo método `base64_encode`. - - - - -## Ajudantes - -#### O que são ajudantes? - -Ajudantes são uma maneira fácil de criar QrCodes que executam uma ação quando escaneados. - -#### E-Mail - -Esse ajudante, gera um qrcode de e-mail que é capaz de ser preenchido no endereço de e-mail, assunto e corpo. - - QrCode::email($to, $subject, $body); - - // Preenche o endereço de email - QrCode::email('foo@bar.com'); - - // Preenche o endereço, título e corpo de um email - QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); - - // Preenche apenas o título e corpo de um email - QrCode::email(null, 'This is the subject.', 'This is the message body.'); - -#### Geo - -Esse ajudante gera uma latitude e longitude que pode ser lido por um aparelho celular e abrir a localização no Google maps ou outro aplicativo similar. - - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -#### Phone Number - -Esse ajudante, gera uma QrCode que pode ser escaneado e exibir um número de telefone. - - QrCode::phoneNumber($phoneNumber); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### SMS (Mensagens de Texto) - -Esse ajudante, cria uma mensagem SMS que pode ser preenchida com o número de telefone e o corpo da mensagem. - - QrCode::SMS($phoneNumber, $message); - - // Cria uma mensagem de texto com o telefone preenchido. - QrCode::SMS('555-555-5555'); - - // Cria uma mensagem de texto com o número telefônico e a mensagem preenchida. - QrCode::SMS('555-555-5555', 'Body of the message'); - -#### WiFi - -Esse ajudante, faz com que QrCodes escaneáveis permitam o aparelho celular se conectar a uma rede WI-FI. - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'SSID da rede', - 'password' => 'Senha da rede', - 'hidden' => 'Se a rede é um SSID oculto ou não.' - ]); - - // Conectar a uma rede wifi - QrCode::wiFi([ - 'ssid' => 'Nome da rede', - ]); - - // Conectar a uma refe wifi oculta - QrCode::wiFi([ - 'ssid' => 'Nome da rede', - 'hidden' => 'true' - ]); - - // Conectar a uma rede wifi segura - QrCode::wiFi([ - 'ssid' => 'Nome da rede', - 'encryption' => 'WPA', - 'password' => 'minhaSenha' - ]); - ->Escaneamento WIFI atualmente não são suportados nos produtos Apple. - - -##Uso Comum do QRCode - -Você pode usar um prefixo listado na tabela abaixo dentro da seção `generate` para criar um QrCode para armazenar informações mais avançadas: - - QrCode::generate('http://www.simplesoftware.io'); - - -| Uso | Prefixo | Exemplo | -| --- | --- | --- | -| URL do site | http:// | http://www.simplesoftware.io | -| URL segura | https:// | https://www.simplesoftware.io | -| Endereço de e-mail | mailto: | mailto:support@simplesoftware.io | -| Número de telefone | tel: | tel:555-555-5555 | -| Texto (SMS) | sms: | sms:555-555-5555 | -| Texto (SMS) With Pretyped Message | sms: | sms::I am a pretyped message | -| Texto (SMS) With Pretyped Message and Number | sms: | sms:555-555-5555:I am a pretyped message | -| Coordenadas | geo: | geo:-78.400364,-85.916993 | -| MeCard | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard | BEGIN:VCARD | [Veja Exemplos](https://en.wikipedia.org/wiki/VCard) | -| Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -##Uso fora do Laravel - -Você pode usar o pacote fora do Laravel instanciando a classe `BaconQrCodeGenerator`. - - use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; - - $qrcode = new BaconQrCodeGenerator; - $qrcode->size(500)->generate('Crie um QrCode sem Laravel!'); diff --git a/docs/ru/README.md b/docs/ru/README.md deleted file mode 100644 index f7bd127..0000000 --- a/docs/ru/README.md +++ /dev/null @@ -1,438 +0,0 @@ -[![Build Status](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - - -- [Введение](#docs-introduction) -- [Переводы](#docs-translations) -- [Конфигурация](#docs-configuration) -- [Простые Идеи](#docs-ideas) -- [Использование](#docs-usage) -- [Хелперы](#docs-helpers) -- [Префиксы](#docs-common-usage) -- [Использование без Laravel](#docs-outside-laravel) - - -## Введение - -Simple QrCode - простая в использовании обёртка для популярного фреймворка Laravel на основе превосходного проекта [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). -Мы создали интерфейс, который привычен и прост в установке для пользователей Laravel. - - -## Переводы - -Мы ищем пользователей, говорящих на китайском, корейском или японском языках, которые могут помочь перевести этот документ. -Пожалуйста, создайте пул реквест, если вы можете сделать перевод! - - -## Конфигурация - -### Composer - -Находясь в директории вашего проекта laravel, выполните команду: - -```bash -composer require simplesoftwareio/simple-qrcode -``` - -Либо добавьте пакет `simplesoftwareio/simple-qrcode` в раздел `require` файла `composer.json`: - -```json -"require": { - "simplesoftwareio/simple-qrcode": "~2" -} -``` - -Затем запустите команду `composer update`. - -### Поставщик услуг (Laravel <= 5.4) - -Добавьте строчку -``` -SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class -``` -в конец массива `providers` в файле `config/app.php`. - -### Алиас (Laravel <= 5.4) - -Добавьте строчку -``` -'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class -``` -в конец массива `aliases` в файле `config/app.php`. - - -## Простые Идеи - -### Печать страниц - -Мы используем QR-коды на страница для печати. -Это позволяет нашим клиентам открыть исходную страницу на устройстве после печати, просто отсканировав этот код. -Для этого в файл `footer.blade.php` мы добавили следующий код: - -```blade -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

Отсканируйте QR-код, чтобы открыть исходную страницу

-
-``` - -### Вставка QR-кода в email - -Вы можете вставить QR-код в email, чтобы позволить пользователям быстро его отсканировать. -Ниже приведен пример того, как сделать это с помощью Laravel: - -```blade -// внутри шаблона blade - -``` - - -## Использование - -### Общий случай использования - -Использовать генератор для QR-код очень легко. -Достаточно вызвать один метод: - -```php -QrCode::generate('Lorem ipsum!'); -``` - -Этот код создаст QR-код с текстом "Lorem ipsum!". - -### Генерация изображений - -Используйте метод `generate()`, чтобы создать изображение QR-кода: - -```php -QrCode::generate('Lorem ipsum!'); -``` - -> Внимание! При вызове в цепочке методов этот метод должен вызываться в конце. - -Метод `generate()` по умолчанию возвращает строку, содержащую SVG-представление изображения. -Поэтому её можно вывести как есть прямо в браузер внутри Blade-шаблона: - -```blade -{!! QrCode::generate('Lorem ipsum!'); !!} -``` - -Чтобы сохранить изображение QR-кода в файл, передайте методу `generate()` путь к файлу вторым аргументом: - -```blade -QrCode::generate('Lorem ipsum!', '../public/qrcodes/qrcode.svg'); -``` - -### Изменение формата - -> По умолчанию QR-код создаётся в формате SVG. - -> **Обратите внимание!** Метод `format()` должен вызываться **перед** всеми остальными методами форматирования, такими как `size()`, `color()`, `backgroundColor()` и `margin()`. - -На данный момент поддерживаются три формата: PNG, EPS и SVG. -Для изменения формата используйте следующий код: - -```php -QrCode::format('png'); -QrCode::format('eps'); -QrCode::format('svg'); -``` - -### Изменение размера - -> По умолчанию QR-код создаётся наименьшего размера. - -Вы можете изменить размер QR-код с помощью метода `size()`. -Просто укажите размер желаемого в пикселях, используя следующий синтаксис: - -```php -QrCode::size(100); -``` - -### Изменение цветов - -> Будьте осторожны при изменении цветов QR-кода. -> Это может затруднить его сканирование. - -Вы можете изменить цвет клеток на изображении. -Для этого следует использовать метод `color()`. -Три аргумента этого метода - значения RGB-палитры соответственно. - -Например, так можно сделать клетки розовыми: - -```php -QrCode::color(255, 0, 255); -``` - -Также поддерживается изменение цвета фона методом `backgroundColor()`. -Например, следующий код сделает фон не белым, а жёлтым: - -```php -QrCode::backgroundColor(255, 255, 0); -``` - -### Поля - -Вы можете изменить внутренние поля изображения. -Это поможет повысить вероятность успешного сканирования. - -Просто укажите количество пикселей между краем изображения и матрицей: - -```php -QrCode::margin(100); -``` - -### Уровень коррекции ошибок - -Для изменения уровня коррекции ошибок используйте следующий метод: - -```php -QrCode::errorCorrection('H'); -``` - -Метод `errorCorrection()` поддерживает следующие уровни: - -| Уровень | Допуск ошибок | -| ------- | ------------- | -| L | 7% | -| M | 15% | -| Q | 25% | -| H | 30% | - -> Чем выше уровень коррекции, тем больше становится QR-код и тем меньше данных он может хранить. -> [Подробнее](https://ru.wikipedia.org/wiki/QR-%D0%BA%D0%BE%D0%B4#.D0.9E.D0.B1.D1.89.D0.B0.D1.8F_.D1.82.D0.B5.D1.85.D0.BD.D0.B8.D1.87.D0.B5.D1.81.D0.BA.D0.B0.D1.8F_.D0.B8.D0.BD.D1.84.D0.BE.D1.80.D0.BC.D0.B0.D1.86.D0.B8.D1.8F). - -### Кодировка символов - -По умолчанию используется кодировка `ISO-8859-1`. -[Подробнее о кодировках символов](https://ru.wikipedia.org/wiki/%D0%9D%D0%B0%D0%B1%D0%BE%D1%80_%D1%81%D0%B8%D0%BC%D0%B2%D0%BE%D0%BB%D0%BE%D0%B2). - -Вы можете кодировку, используя метод `encoding()`: - -```php -QrCode::encoding('UTF-8')->generate('‘Lorem ipsum со специальными символами ♠♥!!'); -``` - -Полный список поддерживаемых кодировок: - -| Кодировка | -| ------------ | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - -> Ошибка `Could not encode content to ISO-8859-1` означает, что вы передали в метод `generate()` строку, символы которой невозможно перевести в ISO-8859-1. -> Если вы не уверены какую кодировку использовать в вашем случае, то перед вызовом `generate()` установите кодировку `UTF-8`. - -### Наложение изображений на QR-код (из файла) - -Метод `merge()` накладывает указанное изображение на QR-код. -Это обычно используется для логотипов, размащаемых в пределах QR-кода. - -```php -QrCode::merge($filename, $percentage, $absolute); - -// Создает QR-код с изображением в центре -QrCode::format('png')->merge('path-to-image.png')->generate(); - -// Создает QR-код с изображением в центре -// Вставленное изображение занимает 30% QR-кода -QrCode::format('png')->merge('path-to-image.png', .3)->generate(); -QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); -``` - -> На данный момент метод `merge()` поддерживает только PNG. - -> По умолчанию путь к файлу считается относительно `base_path()` вашего проекта. -> Если вы указываете абсолютный путь к файлу, то передайте `true` третьим аргументом. - -> Вы должны использовать высокий уровень коррекции ошибок при использовании метода `merge()` чтобы QR-код остался читаемым. -> Рекомендуется использовать `errorCorrection('H')`. - -![Merged Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -### Наложение изображений на QR-код (из двоичной строки) - -Метод `mergeString()` может быть использован для решения той же задачи, что и `merge()`. -Отличие в том, что `mergeString()` принимает строковое представление файла вместо пути к файлу. -Это полезно при работе с фасадом `Storage`. -Этот интерфейс очень похож на вызов `merge()`. - -> Как и в случае с `merge()`, здесь поддерживается только PNG-формат. -> То же самое относится к коррекции ошибок - рекомендуется использовать высокие уровни. - -### Дополнительный функционал - -Все методы поддерживают последовательный вызов. - -Вызывайте метод `generate()` в последнюю очередь, после применения форматирования. - -Примеры последовательных вызовов: - -```php -QrCode::size(250) - ->color(150, 90, 10) - ->backgroundColor(10, 14, 244) - ->generate('Lorem ipsum!'); -QrCode::format('png') - ->size(399) - ->color(40, 40, 40) - ->generate('Lorem ipsum!'); -``` - -Вы можете отобразить в браузере PNG-изображение без его сохранения в файл, выводя закодированную при помощи `base64_encode()` необработанную строку: - -```blade - -``` - - -## Хелперы - -### Что такое хелперы? - -Хелперы предоставляют простой способ создания QR-кода, который заставляет сканер пользователя выполнить определенное действие. - -### Электронная Почта - -Этот хелпер генерирует QR-код для создания email. -Можно указать email адресата, тему и текст письма. - -```php -QrCode::email($to, $subject, $body); - -// Заполняет адресата -QrCode::email('foo@bar.com'); - -// Заполняет адресата, тему и текст сообщения электронной почты. -QrCode::email('foo@bar.com', 'Это тема', 'Это текст'); - -// Заполняет только тему и текст сообщения электронной почты. -QrCode::email(null, 'Это тема', 'Это текст'); -``` - -### Geo - -Этот хелпер генерирует QR-код с координатами точки на карте. -Для этого нужно указать её широту и долготу. -Смартфон пользователя может открыть указанное местоположение в Google Maps или другом приложении карт. - -```php -QrCode::geo($latitude, $longitude); -QrCode::geo(37.822214, -122.481769); -``` - -### Номер телефона - -Этот хелпер генерирует QR-код, при помощи которого можно быстро совершить звонок: - -```php -QrCode::phoneNumber($phoneNumber); -QrCode::phoneNumber('555-555-5555'); -QrCode::phoneNumber('1-800-Laravel'); -``` - -### СМС - -Этот хелпер создаёт СМС-сообщение, в котором уже может быть указан номер телефона адресата и текст сообщения: - -```php -QrCode::SMS($phoneNumber, $message); - -// Создает СМС, где номер телефона уже заполнен. -QrCode::SMS('555-555-5555'); - -// Создает СМС, где номер и текст уже заполнены. -QrCode::SMS('555-555-5555', 'текст сообщения.'); -``` - -### WiFi - -Эти хелперы создают QR-коды, которые помогут подключить смартфон к Wi-Fi: - -```php -QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => 'идентификатор сети (SSID)', - 'password' => 'пароль сети', - 'hidden' => 'является ли сеть скрытой (true/false)' -]); - -// Подключается к открытой сети WiFi. -QrCode::wiFi([ - 'ssid' => 'Имя сети', -]); - -// Подключается к открытой или скрытой сети WiFi. -QrCode::wiFi([ - 'ssid' => 'Имя сети', - 'hidden' => 'true' -]); - -// Подключается к защищенной сети. -QrCode::wiFi([ - 'ssid' => 'Имя сети', - 'encryption' => 'WPA', - 'password' => 'Мой пароль' -]); -``` - -> Сканирование WiFi в настоящее время не поддерживается устройствами Apple. - - -## Префиксы - -Вы можете использовать префиксы вместо хелперов. -Составьте строку по образцу, как в таблице ниже, и передайте её в метод `generate()`, чтобы добиться того же эффекта, как при использовании хелперов: - -```php -QrCode::generate('http://www.simplesoftware.io'); -``` - -| Применение | Префикс | Пример | -| --- | --- | --- | -| Ссылка на сайт | http:// | http://www.simplesoftware.io | -| Безопасная ссылка | https:// | https://www.simplesoftware.io | -| Email | mailto: | mailto:support@simplesoftware.io | -| Телефон для звонка | tel: | tel:555-555-5555 | -| СМС | sms: | sms:555-555-5555 | -| СМС с текстом сообщения | sms: | sms::Какое-то сообщение | -| СМС с текстом сообщения и номером адресата | sms: | sms:555-555-5555:Какое-то сообщение | -| Местоположение на карте | geo: | geo:-78.400364,-85.916993 | -| Визитка (MeCard) | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| Контакт (VCard) | BEGIN:VCARD | [Примеры](https://ru.wikipedia.org/wiki/VCard) | -| Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -## Использование без Laravel - -Вы можете использовать этот пакет за пределами Laravel, просто создав новый объект класса `BaconQrCodeGenerator`. - -```php -use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; - -$qrcode = new BaconQrCodeGenerator; -$qrcode->size(500)->generate('Создайте QR-код без Laravel!'); -``` diff --git a/docs/zh-cn/README.md b/docs/zh-cn/README.md deleted file mode 100644 index a89b97d..0000000 --- a/docs/zh-cn/README.md +++ /dev/null @@ -1,405 +0,0 @@ -[![构建状态](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode.svg?branch=master)](https://travis-ci.org/SimpleSoftwareIO/simple-qrcode) [![最新稳定版本](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![最新版本](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![许可](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) [![下载量](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - - -- [介绍](#docs-introduction) -- [升级指南](#docs-upgrade) -- [配置](#docs-configuration) -- [简例](#docs-ideas) -- [使用说明](#docs-usage) -- [助手模板](#docs-helpers) -- [QrCode 常规用法](#docs-common-usage) -- [在Laravel外的调用方式](#docs-outside-laravel) - - -## 介绍 -Simple QrCode 是基于[Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode) 开发,适用于Laravel框架的软件包. 我们的目的是让二维码能更加便捷的使用在Laravel框架的项目里. - -![Example 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-1.png?raw=true) ![Example 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/example-2.png?raw=true) - - -## 升级指南 - -从v2版本升到v3需要将 `composer.json` 文件中版本改为 `~3` - -如果你需要使用 `png` 文件格式,那么你**必须**安装 `imagick` PHP扩展. - - -## 配置 - -#### Composer安装 - -使用 `composer require simplesoftwareio/simple-qrcode "~3"` 安装软件包, - -Laravel将会自动完成安装工作. - -#### 添加 Service Provider - -###### Laravel <= 5.4 -注册 `SimpleSoftwareIO\QrCode\QrCodeServiceProvider::class` 至 `config/app.php` 的 `providers` 数组里. - -#### 添加 Aliases - -###### Laravel <= 5.4 -最后,注册 `'QrCode' => SimpleSoftwareIO\QrCode\Facades\QrCode::class` 至 `config/app.php` 的 `aliases` 数组里. - - -## 简例 - -#### 显示视图 - -一个重要的应用是在页面中添加来源二维码.这样我们的用户就可以通过扫码返回初始页.我们只需要在 footer.blade.php 文件里添加如下代码即可! - -
- {!! QrCode::size(100)->generate(Request::url()); !!} -

扫我返回初始页

-
- -#### 嵌入二维码 - -你也可以嵌入二维码在你的邮件中,让收信的用户可以快速扫描.以下是在Laravel中实现的例子: - - //Inside of a blade template. - - - -## 使用说明 - -#### 基本使用 -使用QrCode的Generator非常方便. 多数情况下只要这样: - - QrCode::generate('Make me into a QrCode!'); - -这就能创建一个内容是:"Make me into a QrCode!" 的二维码了. - -#### 生成 `generate(string $data, string $filename = null)` - -`Generate` 是用来创建二维码的方法. - - QrCode::generate('Make me into a QrCode!'); - ->注意:要创建二维码必须使用此方法 - -`Generate` 默认返回一个 SVG 格式的图片文本. 你可以直接在Laravel 的 Blade页面 中使用,使用方式如下: - - {!! QrCode::generate('Make me into a QrCode!'); !!} - -`generate` 方法的第二个参数是指定要存储图片数据的文件地址及命名. - - QrCode::generate('Make me into a QrCode!', '../public/qrcodes/qrcode.svg'); - -#### 格式 `format(string $format)` - -现支持 PNG,EPS,SVG 三种格式,设置方式如下: - - QrCode::format('png'); //放回PNG图片 - QrCode::format('eps'); //放回EPS图片 - QrCode::format('svg'); //放回SVG图片 - -> 必须 `imagick` PHP扩展才能生成 `png` 图片. - -#### 尺寸 `size(int $size)` - ->QrCode 的 Generator 默认返回可能最小像素单位的二维码. - -你可以使用 `size` 方法来设置二维码尺寸.下方是设置像素尺寸的方法: - - QrCode::size(100); - -![200 像素](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) ![250 像素](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/250-pixels.png?raw=true) - -#### 颜色 `color(int $red, int $green, int $blue, int $alpha = null)` - ->注意改变颜色后,可能会导致某些设备难以识别. - -颜色设置的格式必须是RGBA格式. 设置方式如下: - -QrCode::color(255, 0, 0); // 红色二维码 -QrCode::color(255, 0, 0, 25); //红色二维码+25%透明度 - -![红色二维码](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-qrcode.png?raw=true) ![红色透明二维码](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent.png?raw=true) - - -#### 背景颜色 `backgroundColor(int $red, int $green, int $blue, int $alpha = null)` - -你可以使用`backgroundColor` 方法来设置背景颜色. - - QrCode::backgroundColor(255, 0, 0); // 红色背景二维码 - QrCode::backgroundColor(255, 0, 0, 25); // 红色25%透明背景二维码 - -![红色背景二维码](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-background.png?raw=true) ![红色透明背景二维码](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/red-25-transparent-background.png?raw=true) - -#### 渐变 `gradient($startRed, $startGreen, $startBlue, $endRed, $endGreen, $endBlue, string $type)` - -你可以使用 `gradient` 方法设置渐变. - -支持以下渐变类型: - -| 类型 | 范例 | -| --- | --- | -| `vertical`垂直 | ![垂直](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/vertical.png?raw=true) | -| `horizontal`水平 | ![水平](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/horizontal.png?raw=true) | -| `diagonal`对角 | ![对角](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/diagonal.png?raw=true) | -| `inverse_diagonal`反对角 | ![反对角](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/inverse_diagonal.png?raw=true) | -| `radial`迳向 | ![迳向](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/radial.png?raw=true) | - -#### 定位颜色 `eyeColor(int $eyeNumber, int $innerRed, int $innerGreen, int $innerBlue, int $outterRed = 0, int $outterGreen = 0, int $outterBlue = 0)` - -你可以使用 `eyeColor` 方法设置定位眼颜色. - -| 数量 | 范例 | -| --- | --- | -| `0` | ![Eye 0](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-0.png?raw=true) | -| `1` | ![Eye 1](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-1.png?raw=true)| -| `2` | ![Eye 2](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/eye-2.png?raw=true) | - -#### 风格 `style(string $style, float $size = 0.5)` - -二维码风格可以轻易的使用 `square`, `dot` 或 `round`来调换. 这将改变二维码中的信息块风格. 第二个参数是设置dot'点'的大小和round的圆度. - -| 风格 | 范例 | -| --- | --- | -| `sqaure`方 | ![方](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `dot`点 | ![点](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/dot.png)| -| `round`圆 | ![圆](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/round.png?raw=true) | - -#### 定位眼风格 `eyeStyle(string $style)` - -二维码定位眼支持2个格式, `sqaure`方 和 `circle`圆. - -| 风格 | 范例 | -| --- | --- | -| `sqaure`方 | ![方](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/200-pixels.png?raw=true) | -| `circle`圆 | ![圆](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/circle-eye.png?raw=true)| - -#### 边距 `margin(int $margin)` - -也支持设置边距. 设置方式如下: - - QrCode::margin(100); - -#### 容错级别 - -改变二维码的容错级别也很方便. 只要这么设置: - - QrCode::errorCorrection('H'); - -下方是 `errorCorrection` 方法支持的容错级别设置. - -| 容错级别 | 说明 | -| --- | --- | -| L | 7% 的字节码恢复率. | -| M | 15% 的字节码恢复率. | -| Q | 25% 的字节码恢复率. | -| H | 30% 的字节码恢复率. | - ->容错级别越高,二维码越大且能存储的数据越少. 详情见: [error correction](http://en.wikipedia.org/wiki/QR_code#Error_correction). - -#### 编码 - -QrCode 创建二维码时可以使用不同的编码. 默认使用 `ISO-8859-1`. 详情见 [character encoding](http://en.wikipedia.org/wiki/Character_encoding) 你可以使用以下的任一种编码: - - QrCode::encoding('UTF-8')->generate('Make me a QrCode with special symbols ♠♥!!'); - -| 编码 | -| --- | -| ISO-8859-1 | -| ISO-8859-2 | -| ISO-8859-3 | -| ISO-8859-4 | -| ISO-8859-5 | -| ISO-8859-6 | -| ISO-8859-7 | -| ISO-8859-8 | -| ISO-8859-9 | -| ISO-8859-10 | -| ISO-8859-11 | -| ISO-8859-12 | -| ISO-8859-13 | -| ISO-8859-14 | -| ISO-8859-15 | -| ISO-8859-16 | -| SHIFT-JIS | -| WINDOWS-1250 | -| WINDOWS-1251 | -| WINDOWS-1252 | -| WINDOWS-1256 | -| UTF-16BE | -| UTF-8 | -| ASCII | -| GBK | -| EUC-KR | - -> 若抛出 `Could not encode content to ISO-8859-1` 意味着使用了错误的编码. 我们建议你使用 `UTF-8`. - -#### 合并 `(string $filepath, float $percentage = .2, bool $absolute = false)` - - `merge` 方法可以让QrCode为生成结果加上图片. 常见的用法是在二维码上加Logo. - - //生成中间有图片的二维码 - QrCode::format('png')->merge('path-to-image.png')->generate(); - - //生成中间有图片的二维码,且图片占整个二维码图片的30%. - QrCode::format('png')->merge('path-to-image.png', .3)->generate(); - - //生成中间有图片的二维码,且图片占整个二维码图片的30%. - QrCode::format('png')->merge('http://www.google.com/someimage.png', .3, true)->generate(); - -> `merge` 方法当前只支持PNG格式的图片 -> 默认使用相对于应用程序的根路径,把第三个参数设置为 `true` 就能切换到使用绝对路径 - -> 为了让二维码保持高可识别度,建议在使用 `merge` 方法时把二维码的容错级别提高. 我们推荐使用: `errorCorrection('H')`. - -![合并Logo](https://raw.githubusercontent.com/SimpleSoftwareIO/simple-qrcode/master/docs/imgs/merged-qrcode.png?raw=true) - -#### 二进制合并 `(string $content, float $percentage = .2)` - - `mergeString` 方法与 `merge` 方法类似, 不同的是它允许你使用一个二进制的String代替图片文件. 这在使用 `Storage` 存储时,会显得很方便. 它的参数与 `merge` 类似. - - //生成中间有图片的二维码 - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'))->generate(); - - //生成中间有图片的二维码,且图片占整个二维码图片的30%. - QrCode::format('png')->mergeString(Storage::get('path/to/image.png'), .3)->generate(); - -> 和 `merge` 方法一样,当前只支持PNG格式. 同样建议将二维码的容错级别提高. - -#### 高级用法 - -所有的方法都支持链式调用. `generate` 方法必须在最后. 例如: - - QrCode::size(250)->color(150,90,10)->backgroundColor(10,14,244)->generate('Make me a QrCode!'); - QrCode::format('png')->size(399)->color(40,40,40)->generate('Make me a QrCode!'); - -你还能不存储图片,而使用 `base64_encode` 来将二进制数据直接显示成二维码图片. - - - - -## 助手模板 - -#### 什么是助手模板? - -助手模板生成一些简易二维码, 扫描二维码时会进行某些操作. - -#### BitCoin比特币 - -这个模板生成可扫描二维码的来接受比特币支付. [详情](https://bitco.in/en/developer-guide#plain-text) - - QrCode::BTC($address, $amount); - - //发送0.334BTC到该地址 - QrCode::BTC('bitcoin address', 0.334); - - //发送0.334BTC到该地址和一些可选设置 - QrCode::size(500)->BTC('address', 0.0034, [ - 'label' => 'my label', - 'message' => 'my message', - 'returnAddress' => 'https://www.returnaddress.com' - ]); - -#### E-Mail - -这个模板可以生成一个直接发E-mail的二维码.包含了发邮件的地址,标题,和内容 - - QrCode::email($to, $subject, $body); - - //加入一个邮件地址 - QrCode::email('foo@bar.com'); - - //加一个邮件地址、标题、内容至二维码. - QrCode::email('foo@bar.com', 'This is the subject.', 'This is the message body.'); - - //只加标题和内容. - QrCode::email(null, 'This is the subject.', 'This is the message body.'); - -#### 位置 - -这个模板能创建一个包含一个经纬度的位置二维码, 并在谷歌地图或类似应用中打开. - - QrCode::geo($latitude, $longitude); - - QrCode::geo(37.822214, -122.481769); - -#### 手机号 - -这个模板能创建一个包含手机号的二维码, 并拨号. - - QrCode::phoneNumber($phoneNumber); - - QrCode::phoneNumber('555-555-5555'); - QrCode::phoneNumber('1-800-Laravel'); - -#### 短信 - -这个模板能创建能创建一个包含发送短信目标手机号和内容的二维码. - - QrCode::SMS($phoneNumber, $message); - - //创建一个只有手机号的短信二维码. - QrCode::SMS('555-555-5555'); - - //创建一个包含手机号和文字内容的短信二维码. - QrCode::SMS('555-555-5555', 'Body of the message'); - -#### WiFi - -这个模板能创建扫一下能连接WIFI的二维码. - - QrCode::wiFi([ - 'encryption' => 'WPA/WEP', - 'ssid' => '网络的SSID', - 'password' => '网络的密码', - 'hidden' => '是否是一个隐藏SSID的网络' - ]); - - //连接一个开放的网络 - QrCode::wiFi([ - 'ssid' => '网络名称', - ]); - - //连接一个开放并隐藏的网络. - QrCode::wiFi([ - 'ssid' => '网络名称', - 'hidden' => 'true' - ]); - - //连接一个加密的WIFI网络. - QrCode::wiFi([ - 'ssid' => '网络名称', - 'encryption' => 'WPA', - 'password' => '密码' - ]); - -> WIFI扫描目前苹果产品不支持. - - -##QrCode 常规用法 - -你还能通过下面表中的前缀信息创建适合更多场合的二维码 - - QrCode::generate('http://www.simplesoftware.io'); - - -| 使用场景 | 前缀 | 例子 | -| --- | --- | --- | -| 网址 | http:// | http://www.simplesoftware.io | -| 加密网址 | https:// | https://www.simplesoftware.io | -| E-mail 地址 | mailto: | mailto:support@simplesoftware.io | -| 电话号码 | tel: | tel:555-555-5555 | -| 文字短信 | sms: | sms:555-555-5555 | -| 文字短信内容 | sms: | sms::I am a pretyped message | -| 文字短信同时附带手机号和短信内容 | sms: | sms:555-555-5555:I am a pretyped message | -| 坐标 | geo: | geo:-78.400364,-85.916993 | -| MeCard名片 | mecard: | MECARD:Simple, Software;Some Address, Somewhere, 20430;TEL:555-555-5555;EMAIL:support@simplesoftware.io; | -| VCard名片 | BEGIN:VCARD | [更多范例](https://en.wikipedia.org/wiki/VCard) | -| Wifi | wifi: | wifi:WEP/WPA;SSID;PSK;Hidden(True/False) | - - -##在Laravel外的调用方式 - -你还可以在Laravel框架之外调用,只需要实例化 `BaconQrCodeGenerator` 类. - - use SimpleSoftwareIO\QrCode\BaconQrCodeGenerator; - - $qrcode = new BaconQrCodeGenerator; - $qrcode->size(500)->generate('Make a qrcode without Laravel!'); From 264e176f25ea9b4fb76f3c2e65196396f6c9d954 Mon Sep 17 00:00:00 2001 From: Abdul Rahmad Pasaribu Date: Fri, 17 Jan 2025 11:45:24 +0700 Subject: [PATCH 6/6] docs: change some documentation & project metadata --- LICENSE | 1 + README.md | 46 +--------------------------------------------- composer.json | 21 +++++++++++++++------ 3 files changed, 17 insertions(+), 51 deletions(-) diff --git a/LICENSE b/LICENSE index 5a20219..91858d6 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,7 @@ The MIT License (MIT) Copyright (c) 2014-2020 Simple Software LLC www.simplesoftware.io +Copyright (c) 2025 Abdul Rahmad Pasaribu misterabdul.moe Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index d85dbd1..f847725 100644 --- a/README.md +++ b/README.md @@ -1,47 +1,3 @@ Simple QrCode -======================== -![Unit Tests](https://github.com/SimpleSoftwareIO/simple-qrcode/workflows/Unit%20Tests/badge.svg) -[![Latest Stable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/stable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) -[![Latest Unstable Version](https://poser.pugx.org/simplesoftwareio/simple-qrcode/v/unstable.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) -[![License](https://poser.pugx.org/simplesoftwareio/simple-qrcode/license.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) -[![Total Downloads](https://poser.pugx.org/simplesoftwareio/simple-qrcode/downloads.svg)](https://packagist.org/packages/simplesoftwareio/simple-qrcode) - -## [Deutsch](https://www.simplesoftware.io/#/docs/simple-qrcode/de) | [Español](https://www.simplesoftware.io/#/docs/simple-qrcode/es) | [Français](https://www.simplesoftware.io/#/docs/simple-qrcode/fr) | [Italiano](https://www.simplesoftware.io/#/docs/simple-qrcode/it) | [Português](https://www.simplesoftware.io/#/docs/simple-qrcode/pt-br) | [Русский](https://www.simplesoftware.io/#/docs/simple-qrcode/ru) | [日本語](https://www.simplesoftware.io/#/docs/simple-qrcode/ja) | [한국어](https://www.simplesoftware.io/#/docs/simple-qrcode/kr) | [हिंदी](https://www.simplesoftware.io/#/docs/simple-qrcode/hi) | [简体中文](https://www.simplesoftware.io/#/docs/simple-qrcode/zh-cn) | [العربية](https://www.simplesoftware.io/#/docs/simple-qrcode/ar) - -Language files are currently out of date. We need volunteers to upgrade them to v4! Please submit a PR request! - -### Try our dead simple, free file transfer service [keep.sh](https://keep.sh) - -[![keep.sh](https://user-images.githubusercontent.com/624784/95805291-1121e980-0cd3-11eb-9048-0264bd9f2fd7.gif)](https://keep.sh) - -Easy fast file sharing from the command line with a single curl command! `curl --upload-file your-local-file.txt https://keep.sh` - -## Introduction -Simple QrCode is an easy to use wrapper for the popular Laravel framework based on the great work provided by [Bacon/BaconQrCode](https://github.com/Bacon/BaconQrCode). We created an interface that is familiar and easy to install for Laravel users. - -## Official Documentation - -Documentation for Simple QrCode can be found on our [website.](http://www.simplesoftware.io/#/docs/simple-qrcode) - -## Examples - -![Example 1](docs/imgs/example-1.png) ![Example 2](docs/imgs/example-2.png) - -## Use Cases -

- - - -

-

- Platform to sell tickets online -

- -## Contributing - -Please submit all issues and pull requests to the [simplesoftwareio/simple-qrcode](https://github.com/simplesoftwareio/simple-qrcode) repository on the develop branch! - -## License - -This software is released under the [MIT license.](https://opensource.org/licenses/MIT) +Another fork of [simple-qrcode](https://github.com/SimpleSoftwareIO/simple-qrcode) because it seems no longer maintained. I just update the code to work with newer Laravel & PHP version. \ No newline at end of file diff --git a/composer.json b/composer.json index 213a8c4..e0524d4 100644 --- a/composer.json +++ b/composer.json @@ -1,18 +1,27 @@ { - "name": "simplesoftwareio/simple-qrcode", + "name": "misterabdul/simple-qrcode", "description": "Simple QrCode is a QR code generator made for Laravel.", - "keywords": ["qrcode", "laravel", "simple", "generator", "wrapper"], - "homepage": "https://www.simplesoftware.io/#/docs/simple-qrcode", - "license" : "MIT", + "keywords": [ + "qrcode", + "laravel", + "simple", + "generator", + "wrapper" + ], + "license": "MIT", "authors": [ { "name": "Simple Software LLC", "email": "support@simplesoftware.io" + }, + { + "name": "Abdul Rahmad Pasaribu", + "email": "abdoelrachmad@gmail.com" } ], "require": { "php": "^8.2", - "ext-gd": "*", + "ext-gd": "*", "bacon/bacon-qr-code": "^3.0", "illuminate/support": "^11.0" }, @@ -42,4 +51,4 @@ } } } -} +} \ No newline at end of file