-
-
Notifications
You must be signed in to change notification settings - Fork 303
/
Copy pathimageWithText.php
117 lines (84 loc) · 2.94 KB
/
imageWithText.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<?php
/**
* GdImage example for displaying additional text under the QR Code
*
* @link https://github.com/chillerlan/php-qrcode/issues/35
*
* @created 22.06.2019
* @author Smiley <[email protected]>
* @copyright 2019 Smiley
* @license MIT
*
* @noinspection PhpIllegalPsrClassPathInspection, PhpComposerExtensionStubsInspection
*/
declare(strict_types=1);
use chillerlan\QRCode\{QRCode, QROptions};
use chillerlan\QRCode\Output\QRGdImagePNG;
require_once __DIR__.'/../vendor/autoload.php';
/*
* Class definition
*/
class QRImageWithText extends QRGdImagePNG{
public function dump(string|null $file = null, string|null $text = null):string{
// set returnResource to true to skip further processing for now
$this->options->returnResource = true;
// there's no need to save the result of dump() into $this->image here
parent::dump($file);
// render text output if a string is given
if($text !== null){
$this->addText($text);
}
$imageData = $this->dumpImage();
$this->saveToFile($imageData, $file);
if($this->options->outputBase64){
$imageData = $this->toBase64DataURI($imageData);
}
return $imageData;
}
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($this->options->imageTransparent){
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 = round(($bgWidth - strlen($text) * $w) / 2);
// loop through the string and draw the letters
foreach(str_split($text) as $i => $chr){
imagechar($this->image, $textSize, (int)($i * $w + $x), $this->length, $chr, $fontColor);
}
}
}
/*
* Runtime
*/
$options = new QROptions;
$options->version = 7;
$options->scale = 3;
$options->outputBase64 = false;
$qrcode = new QRCode($options);
$qrcode->addByteSegment('https://www.youtube.com/watch?v=dQw4w9WgXcQ');
// invoke the custom output interface manually
$qrOutputInterface = new QRImageWithText($options, $qrcode->getQRMatrix());
// dump the output, with additional text
// the text could also be supplied via the options, see the svgWithLogo example
$out = $qrOutputInterface->dump(null, 'example text');
header('Content-type: image/png');
echo $out;
exit;