From d7afadff90828f1ff6a4e9de50bf2c7a64b38c47 Mon Sep 17 00:00:00 2001 From: codemasher Date: Sat, 22 Jun 2019 16:26:55 +0200 Subject: [PATCH] :sparkles: example for https://github.com/chillerlan/php-qrcode/issues/35 --- examples/QRImageWithText.php | 99 ++++++++++++++++++++++++++++++++++++ examples/imageWithText.php | 33 ++++++++++++ 2 files changed, 132 insertions(+) create mode 100644 examples/QRImageWithText.php create mode 100644 examples/imageWithText.php diff --git a/examples/QRImageWithText.php b/examples/QRImageWithText.php new file mode 100644 index 000000000..144a5647c --- /dev/null +++ b/examples/QRImageWithText.php @@ -0,0 +1,99 @@ + + * @copyright 2019 smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\Output\QRImage; + +class QRImageWithText extends QRImage{ + + /** + * @param string|null $file + * @param string|null $text + * + * @return string + */ + public function dump(string $file = null, string $text = null):string{ + $this->image = \imagecreatetruecolor($this->length, $this->length); + $background = \imagecolorallocate($this->image, ...$this->options->imageTransparencyBG); + + if((bool)$this->options->imageTransparent && \in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){ + \imagecolortransparent($this->image, $background); + } + + \imagefilledrectangle($this->image, 0, 0, $this->length, $this->length, $background); + + foreach($this->matrix->matrix() as $y => $row){ + foreach($row as $x => $M_TYPE){ + $this->setPixel($x, $y, $this->moduleValues[$M_TYPE]); + } + } + + // render text output if a string is given + if($text !== null){ + $this->addText($text); + } + + $imageData = $this->dumpImage($file); + + if((bool)$this->options->imageBase64){ + $imageData = 'data:image/'.$this->options->outputType.';base64,'.\base64_encode($imageData); + } + + return $imageData; + } + + /** + * @param string $text + */ + protected function addText(string $text):void{ + // save the qrcode image + $qrcode = $this->image; + + // options things + $textSize = 3; // see imagefontheight() and imagefontwidth() + $textBG = [200, 200, 200]; + $textColor = [50, 50, 50]; + + $bgWidth = $this->length; + $bgHeight = $bgWidth + 20; // 20px extra space + + // create a new image with additional space + $this->image = \imagecreatetruecolor($bgWidth, $bgHeight); + $background = \imagecolorallocate($this->image, ...$textBG); + + // allow transparency + if((bool)$this->options->imageTransparent && \in_array($this->options->outputType, $this::TRANSPARENCY_TYPES, true)){ + \imagecolortransparent($this->image, $background); + } + + // fill the background + \imagefilledrectangle($this->image, 0, 0, $bgWidth, $bgHeight, $background); + + // copy over the qrcode + \imagecopymerge($this->image, $qrcode, 0, 0, 0, 0, $this->length, $this->length, 100); + \imagedestroy($qrcode); + + $fontColor = \imagecolorallocate($this->image, ...$textColor); + $w = \imagefontwidth($textSize); + $x = ($bgWidth - round((strlen($text) * $w))) / 2; + + // loop through the string and draw the letters + foreach(str_split($text) as $i => $chr){ + \imagechar($this->image, $textSize, $i * $w + $x, $this->length, $chr, $fontColor); + } + } + +} diff --git a/examples/imageWithText.php b/examples/imageWithText.php new file mode 100644 index 000000000..050781cba --- /dev/null +++ b/examples/imageWithText.php @@ -0,0 +1,33 @@ + + * @copyright 2019 Smiley + * @license MIT + */ + +namespace chillerlan\QRCodeExamples; + +use chillerlan\QRCode\{QRCode, QROptions}; + +require_once __DIR__.'/../vendor/autoload.php'; + +$data = 'https://www.youtube.com/watch?v=DLzxrzFCyOs&t=43s'; + +$options = new QROptions([ + 'version' => 7, + 'outputType' => QRCode::OUTPUT_IMAGE_PNG, + 'scale' => 3, + 'imageBase64' => false, +]); + +header('Content-type: image/png'); + +$qrOutputInterface = new QRImageWithText($options, (new QRCode($options))->getMatrix($data)); + +// dump the output, with additional text +echo $qrOutputInterface->dump(null, 'example text');