Jelajahi Sumber

:sparkles: example for https://github.com/chillerlan/php-qrcode/issues/35

codemasher 6 tahun lalu
induk
melakukan
d7afadff90
2 mengubah file dengan 132 tambahan dan 0 penghapusan
  1. 99 0
      examples/QRImageWithText.php
  2. 33 0
      examples/imageWithText.php

+ 99 - 0
examples/QRImageWithText.php

@@ -0,0 +1,99 @@
+<?php
+/**
+ * Class QRImageWithText
+ *
+ * example for additional text
+ * @link https://github.com/chillerlan/php-qrcode/issues/35
+ *
+ * @filesource   QRImageWithText.php
+ * @created      22.06.2019
+ * @package      chillerlan\QRCodeExamples
+ * @author       smiley <smiley@chillerlan.net>
+ * @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);
+		}
+	}
+
+}

+ 33 - 0
examples/imageWithText.php

@@ -0,0 +1,33 @@
+<?php
+/**
+ * example for additional text
+ * @link https://github.com/chillerlan/php-qrcode/issues/35
+ *
+ * @filesource   imageWithText.php
+ * @created      22.06.2019
+ * @author       Smiley <smiley@chillerlan.net>
+ * @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');