diff --git a/examples/Readme.md b/examples/Readme.md index 150bab173..ad09a301c 100644 --- a/examples/Readme.md +++ b/examples/Readme.md @@ -19,6 +19,7 @@ - [Custom output](./custom_output.php): a simple example that demonstrates the usage of custom output classes - [GD Image with logo](./imageWithLogo.php): a logo on top of the QR Code - [GD image with text](./imageWithText.php): description text under the QR Code ([#35](https://github.com/chillerlan/php-qrcode/issues/35)) +- [GD Image with rounded modules](./pngWithRoundedShapes.php): Similar to "melted" modules, but more rounded ([#127](https://github.com/chillerlan/php-qrcode/issues/127)) - [ImageMagick with logo](./imagickWithLogo.php): a logo on top of the QR Code - [SVG with logo](./svgWithLogo.php): an SVG QR Code with embedded logo (that is also SVG) - [SVG with "melted" modules](./svgMeltedModules.php): an effect where the matrix appears to be like melted wax ([#127](https://github.com/chillerlan/php-qrcode/issues/127)) diff --git a/examples/pngWithRoundedShapes.php b/examples/pngWithRoundedShapes.php new file mode 100644 index 000000000..9f1b3be01 --- /dev/null +++ b/examples/pngWithRoundedShapes.php @@ -0,0 +1,222 @@ +scale); + $y1 = ($y * $this->scale); + $x2 = (($x + 1) * $this->scale); + $y2 = (($y + 1) * $this->scale); + + $rectsize = ($this->scale / 2); + + /** + * @var int $neighbours + * The right bit order (starting from 0): + * 0 1 2 + * 7 # 3 + * 6 5 4 + */ + $neighbours = $this->matrix->checkNeighbours($x, $y); + + // ------------------ + // Outer rounding + // ------------------ + + if ($neighbours & (1 << 7)) { // neighbour left + // top left + imagefilledrectangle( + $this->image, + $x1, + $y1, + ($x1 + $rectsize), + ($y1 + $rectsize), + $this->moduleValues[$M_TYPE] + ); + // bottom left + imagefilledrectangle( + $this->image, + $x1, + ($y2 - $rectsize), + ($x1 + $rectsize), + $y2, + $this->moduleValues[$M_TYPE] + ); + } + + if ($neighbours & (1 << 3)) { // neighbour right + // top right + imagefilledrectangle( + $this->image, + ($x2 - $rectsize), + $y1, + $x2, + ($y1 + $rectsize), + $this->moduleValues[$M_TYPE] + ); + // bottom right + imagefilledrectangle( + $this->image, + ($x2 - $rectsize), + ($y2 - $rectsize), + $x2, + $y2, + $this->moduleValues[$M_TYPE] + ); + } + + if ($neighbours & (1 << 1)) { // neighbour top + // top left + imagefilledrectangle( + $this->image, + $x1, + $y1, + ($x1 + $rectsize), + ($y1 + $rectsize), + $this->moduleValues[$M_TYPE] + ); + // top right + imagefilledrectangle( + $this->image, + ($x2 - $rectsize), + $y1, + $x2, + ($y1 + $rectsize), + $this->moduleValues[$M_TYPE] + ); + } + + if ($neighbours & (1 << 5)) { // neighbour bottom + // bottom left + imagefilledrectangle( + $this->image, + $x1, + ($y2 - $rectsize), + ($x1 + $rectsize), + $y2, + $this->moduleValues[$M_TYPE] + ); + // bottom right + imagefilledrectangle( + $this->image, + ($x2 - $rectsize), + ($y2 - $rectsize), + $x2, + $y2, + $this->moduleValues[$M_TYPE] + ); + } + + // --------------------- + // inner rounding + // --------------------- + + if (!$this->matrix->check($x, $y)) { + + if (($neighbours & 1) && ($neighbours & (1 << 7)) && ($neighbours & (1 << 1))) { + // top left + imagefilledrectangle( + $this->image, + $x1, + $y1, + ($x1 + $rectsize), + ($y1 + $rectsize), + $this->moduleValues[($M_TYPE | QRMatrix::IS_DARK)] + ); + } + + if (($neighbours & (1 << 1)) && ($neighbours & (1 << 2)) && ($neighbours & (1 << 3))) { + // top right + imagefilledrectangle( + $this->image, + ($x2 - $rectsize), + $y1, + $x2, + ($y1 + $rectsize), + $this->moduleValues[($M_TYPE | QRMatrix::IS_DARK)] + ); + } + + if (($neighbours & (1 << 7)) && ($neighbours & (1 << 6)) && ($neighbours & (1 << 5))) { + // bottom left + imagefilledrectangle( + $this->image, + $x1, + ($y2 - $rectsize), + ($x1 + $rectsize), + $y2, + $this->moduleValues[($M_TYPE | QRMatrix::IS_DARK)] + ); + } + + if (($neighbours & (1 << 3)) && ($neighbours & (1 << 4)) && ($neighbours & (1 << 5))) { + // bottom right + imagefilledrectangle( + $this->image, + ($x2 - $rectsize), + ($y2 - $rectsize), + $x2, + $y2, + $this->moduleValues[($M_TYPE | QRMatrix::IS_DARK)] + ); + } + } + + imagefilledellipse( + $this->image, + (int)(($x * $this->scale) + ($this->scale / 2)), + (int)(($y * $this->scale) + ($this->scale / 2)), + (int)($this->scale - 1), + (int)($this->scale - 1), + $this->moduleValues[$M_TYPE] + ); + } +} + + +// -------------------- +// Example +// -------------------- + +$options = new QROptions([ + 'outputType' => QROutputInterface::CUSTOM, + 'outputInterface' => QRGdRounded::class, + 'eccLevel' => EccLevel::M, + 'imageTransparent' => false, + 'imageBase64' => false, + 'scale' => 30 +]); + +$qrcode = new QRCode($options); + +$img = $qrcode->render('https://www.youtube.com/watch?v=dQw4w9WgXcQ'); + +header('Content-type: image/png'); + +echo $img;