-
-
Notifications
You must be signed in to change notification settings - Fork 302
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
7a03897
commit 132520b
Showing
1 changed file
with
111 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,111 @@ | ||
<?php | ||
/** | ||
* SVG to raster conversion example using ImageMagick | ||
* | ||
* @created 19.09.2023 | ||
* @author smiley <[email protected]> | ||
* @copyright 2023 smiley | ||
* @license MIT | ||
*/ | ||
|
||
use chillerlan\QRCode\Data\QRMatrix; | ||
use chillerlan\QRCode\Output\QRMarkupSVG; | ||
use chillerlan\QRCode\Output\QROutputInterface; | ||
use chillerlan\QRCode\QRCode; | ||
use chillerlan\QRCode\QROptions; | ||
|
||
require_once __DIR__.'/../vendor/autoload.php'; | ||
|
||
class SVGConvert extends QRMarkupSVG{ | ||
|
||
/** @inheritDoc */ | ||
protected function header():string{ | ||
[$width, $height] = $this->getOutputDimensions(); | ||
|
||
$header = sprintf( | ||
'<svg xmlns="http://www.w3.org/2000/svg" class="qr-svg %1$s" viewBox="%2$s" preserveAspectRatio="%3$s" width="%4$s" height="%5$s">%6$s', | ||
$this->options->cssClass, | ||
$this->getViewBox(), | ||
$this->options->svgPreserveAspectRatio, | ||
($width * $this->scale), | ||
($height * $this->scale), | ||
$this->options->eol | ||
); | ||
|
||
if($this->options->svgAddXmlHeader){ | ||
$header = sprintf('<?xml version="1.0" encoding="UTF-8"?>%s%s', $this->options->eol, $header); | ||
} | ||
|
||
return $header; | ||
} | ||
|
||
/** @inheritDoc */ | ||
public function dump(string $file = null):string{ | ||
$base64 = $this->options->outputBase64; | ||
// we don't want the SVG in base64 | ||
$this->options->outputBase64 = false; | ||
|
||
$svg = $this->createMarkup($file !== null); | ||
|
||
// now convert the output | ||
$im = new Imagick; | ||
$im->readImageBlob($svg); | ||
$im->setImageFormat($this->options->imagickFormat); | ||
|
||
$imageData = $im->getImageBlob(); | ||
|
||
$this->saveToFile($imageData, $file); | ||
|
||
if($base64){ | ||
// use finfo to guess the mime type | ||
$imageData = $this->toBase64DataURI($imageData, (new finfo(FILEINFO_MIME_TYPE))->buffer($imageData)); | ||
} | ||
|
||
return $imageData; | ||
} | ||
|
||
} | ||
|
||
|
||
// SVG from the basic example | ||
$options = new QROptions; | ||
|
||
$options->version = 7; | ||
$options->outputType = QROutputInterface::CUSTOM; | ||
$options->outputInterface = SVGConvert::class; | ||
$options->imagickFormat = 'png32'; | ||
$options->scale = 20; | ||
$options->outputBase64 = false; | ||
$options->drawLightModules = true; | ||
$options->markupDark = ''; | ||
$options->markupLight = ''; | ||
$options->drawCircularModules = true; | ||
$options->circleRadius = 0.4; | ||
$options->connectPaths = true; | ||
$options->keepAsSquare = [ | ||
QRMatrix::M_FINDER_DARK, | ||
QRMatrix::M_FINDER_DOT, | ||
QRMatrix::M_ALIGNMENT_DARK, | ||
]; | ||
$options->svgDefs = ' | ||
<linearGradient id="rainbow" x1="1" y2="1"> | ||
<stop stop-color="#e2453c" offset="0"/> | ||
<stop stop-color="#e07e39" offset="0.2"/> | ||
<stop stop-color="#e5d667" offset="0.4"/> | ||
<stop stop-color="#51b95b" offset="0.6"/> | ||
<stop stop-color="#1e72b7" offset="0.8"/> | ||
<stop stop-color="#6f5ba7" offset="1"/> | ||
</linearGradient> | ||
<style><![CDATA[ | ||
.dark{fill: url(#rainbow);} | ||
.light{fill: #eee;} | ||
svg{ width: 530px; height: 530px; } | ||
]]></style>'; | ||
|
||
|
||
// render the SVG and convert to the desired ImageMagick format | ||
$image = (new QRCode($options))->render('https://www.youtube.com/watch?v=dQw4w9WgXcQ'); | ||
|
||
header('Content-type: image/png'); | ||
|
||
echo $image; |