Skip to content

Commit

Permalink
📖
Browse files Browse the repository at this point in the history
  • Loading branch information
codemasher committed May 6, 2024
1 parent e4cbe56 commit de3d321
Show file tree
Hide file tree
Showing 16 changed files with 362 additions and 175 deletions.
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,8 +61,9 @@ It also features a QR Code reader based on a [PHP port](https://github.com/khana
- [`ext-imagick`](https://github.com/Imagick/imagick) with [ImageMagick](https://imagemagick.org) installed
- [`ext-fileinfo`](https://www.php.net/manual/book.fileinfo.php) (required by `QRImagick` output)
- [`setasign/fpdf`](https://github.com/setasign/fpdf) for the PDF output module
- [`intervention/image`](https://github.com/Intervention/image) for alternative GD/ImageMagick output

For the QRCode reader, either `ext-gd` or `ext-imagick` is required!
For the QR Code reader, either `ext-gd` or `ext-imagick` is required!


# Documentation
Expand Down
16 changes: 3 additions & 13 deletions docs/Built-In-Output/QREps.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# QREps

[Class `QREps`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QREps.php): [Encapsulated Postscript](https://en.wikipedia.org/wiki/Encapsulated_PostScript) (EPS) output.
[Class `QREps`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QREps.php):
[Encapsulated Postscript](https://en.wikipedia.org/wiki/Encapsulated_PostScript) (EPS) output.


## Example
Expand Down Expand Up @@ -50,6 +51,7 @@ echo (new QRCode($options))->render($data);
exit;
```


## Additional methods

| method | return | description |
Expand All @@ -67,15 +69,3 @@ exit;
| `$drawLightModules` | `bool` |
| `$excludeFromConnect` | `array` |
| `$scale` | `int` |


### Options that have no effect

| property | reason |
|------------------------|-----------------|
| `$circleRadius` | not implemented |
| `$drawCircularModules` | not implemented |
| `$outputBase64` | N/A |
| `$imageTransparent` | N/A |
| `$keepAsSquare` | not implemented |
| `$returnResource` | N/A |
15 changes: 2 additions & 13 deletions docs/Built-In-Output/QRFpdf.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# QRFpdf

[Class `QRFpdf`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRFpdf.php): [Portable Document Format](https://en.wikipedia.org/wiki/PDF) (PDF) output via [FPDF](https://github.com/setasign/fpdf)
[Class `QRFpdf`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRFpdf.php):
[Portable Document Format](https://en.wikipedia.org/wiki/PDF) (PDF) output via [FPDF](https://github.com/setasign/fpdf).


## Example
Expand Down Expand Up @@ -74,15 +75,3 @@ echo $fpdf->Output('S');
| `$outputBase64` | `bool` |
| `$returnResource` | `bool` |
| `$scale` | `ìnt` |


### Options that have no effect

| property | reason |
|------------------------|--------|
| `$circleRadius` | N/A |
| `$connectPaths` | N/A |
| `$drawCircularModules` | N/A |
| `$excludeFromConnect` | N/A |
| `$imageTransparent` | N/A |
| `$keepAsSquare` | N/A |
30 changes: 12 additions & 18 deletions docs/Built-In-Output/QRGdImage.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# QRGdImage

[Class `QRGdImage`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRGdImage.php): [GdImage](https://www.php.net/manual/book.image) raster graphic output (GIF, JPG, PNG)
[Class `QRGdImage`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRGdImage.php):
[GdImage](https://www.php.net/manual/book.image) raster graphic output (GIF, JPG, PNG, ...)


## Example
Expand Down Expand Up @@ -51,12 +52,12 @@ printf('<img alt="%s" src="%s" />', $alt, $out);
```


Return the `GdImage` instance/resource (will ignore other output options):
Return the `GdImage` instance (will ignore other output options):

```php
$options->returnResource = true;

/** @var \GdImage|resource $gdImage */
/** @var \GdImage $gdImage */
$gdImage = (new QRCode($options))->render($data);

// do stuff with the GdImage instance...
Expand All @@ -73,13 +74,14 @@ imagedestroy($gdImage);

## Additional methods

| method | return | description |
|---------------------------------------------------|----------|-------------------------------------------------------------------|
| (protected) `drawImage()` | `void` | Draws the QR image |
| (protected) `dumpImage()` | `string` | Creates the final image by calling the desired GD output function |
| (protected) `module(int $x, int $y, int $M_TYPE)` | `void` | Renders a single module |
| (protected) `setBgColor()` | `void` | Sets the background color |
| (protected) `setTransparencyColor()` | `void` | Sets the transparency color |
| method | return | description |
|---------------------------------------------------|----------|--------------------------------------------------------------------------------------------------|
| (protected) `drawImage()` | `void` | Draws the QR image |
| (protected) `dumpImage()` | `string` | Creates the final image by calling the desired GD output function |
| (protected) `module(int $x, int $y, int $M_TYPE)` | `void` | Renders a single module |
| (protected) `setBgColor()` | `void` | Sets the background color |
| (protected) `setTransparencyColor()` | `void` | Sets the transparency color |
| (abstract protected) `renderImage()` | `void` | Renders the image with the gdimage function for the desired output, implemented by child classes |


## Options that affect this module
Expand All @@ -97,11 +99,3 @@ imagedestroy($gdImage);
| `$returnResource` | `bool` |
| `$scale` | `int` |
| `$transparencyColor` | `mixed` |


### Options that have no effect

| property | reason |
|-----------------------|--------|
| `$connectPaths` | N/A |
| `$excludeFromConnect` | N/A |
8 changes: 0 additions & 8 deletions docs/Built-In-Output/QRImagick.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,11 +102,3 @@ echo $imagick->getImageBlob();
| `$returnResource` | `bool` |
| `$scale` | `int` |
| `$transparencyColor` | `mixed` |


### Options that have no effect

| property | reason |
|-----------------------|--------|
| `$connectPaths` | N/A |
| `$excludeFromConnect` | N/A |
102 changes: 102 additions & 0 deletions docs/Built-In-Output/QRInterventionImage.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# QRInterventionImage

[Class `QRInterventionImage`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRInterventionImage.php):
[intervention/image](https://image.intervention.io/) alternative GD/ImageMagick output.

***Note:** this output class works significantly slower than the native GD/Imagick output classes due to the several underlying abstraction layers. Use only if you must.*


## Example

See: [intervention/image example](https://github.com/chillerlan/php-qrcode/blob/main/examples/intervention-image.php)

Set the options:

```php
$options = new QROptions;

$options->outputInterface = QRInterventionImage::class;
$options->scale = 20;
$options->bgColor = '#ccccaa';
$options->imageTransparent = false;
$options->transparencyColor = '#ccccaa';
$options->drawLightModules = false;
$options->drawCircularModules = true;
$options->circleRadius = 0.4;
$options->keepAsSquare = [
QRMatrix::M_FINDER_DARK,
QRMatrix::M_FINDER_DOT,
QRMatrix::M_ALIGNMENT_DARK,
];
$options->moduleValues = [
QRMatrix::M_FINDER_DARK => '#A71111', // dark (true)
QRMatrix::M_FINDER_DOT => '#A71111', // finder dot, dark (true)
QRMatrix::M_FINDER => '#FFBFBF', // light (false)
QRMatrix::M_ALIGNMENT_DARK => '#A70364',
QRMatrix::M_ALIGNMENT => '#FFC9C9',
QRMatrix::M_VERSION_DARK => '#650098',
QRMatrix::M_VERSION => '#E0B8FF',
];
```


Render the output:

```php
$data = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
$out = (new QRCode($options))->render($data); // -> data:image/png;base64,...

printf('<img alt="%s" src="%s" />', $alt, $out);
```


Return the `ImageInterface` instance (will ignore other output options):

```php
$options->returnResource = true;

/** @var \Intervention\Image\Interfaces\ImageInterface $image */
$image = (new QRCode($options))->render($data);

// do stuff with the ImageInterface instance...

// ...dump output

header('Content-type: image/png');

echo $image->toPng()->toString();
```

Set a different driver in the internal `ImageManager` instance (the internal detection order is: 1. GD, 2. Imagick):

```php
$qrOutputInterface = new QRInterventionImage($options, $matrix);
// set a different driver
$qrOutputInterface->setDriver(new \Intervention\Image\Drivers\Imagick\Driver);
// dump output
$out = $qrOutputInterface->dump();
```


## Additional methods

| method | return | description |
|--------------------------------------|----------|----------------------------------------------------------------------------------------------------------------------|
| `setDriver(DriverInterface $driver)` | `static` | Sets a DriverInterface, see [instantiation (intervention.io)](https://image.intervention.io/v3/basics/instantiation) |
| (protected) `module()` | `void` | Draws a single pixel at the given position |


## Options that affect this module

| property | type |
|------------------------|----------|
| `$bgColor` | `mixed` |
| `$circleRadius` | `float` |
| `$drawCircularModules` | `bool` |
| `$drawLightModules` | `bool` |
| `$imageTransparent` | `bool` |
| `$keepAsSquare` | `array` |
| `$outputBase64` | `bool` |
| `$returnResource` | `bool` |
| `$scale` | `int` |
| `$transparencyColor` | `mixed` |
21 changes: 7 additions & 14 deletions docs/Built-In-Output/QRMarkupSVG.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
# QRMarkupSVG

[Class `QRMarkupSVG`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRMarkupSVG.php): [Scalable Vector Graphics](https://developer.mozilla.org/en-US/docs/Glossary/SVG) (SVG) output
[Class `QRMarkupSVG`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRMarkupSVG.php):
[Scalable Vector Graphics](https://developer.mozilla.org/en-US/docs/Glossary/SVG) (SVG) output.


## Example

See: [ImageMagick example](https://github.com/chillerlan/php-qrcode/blob/main/examples/imagick.php)
See: [SVG example](https://github.com/chillerlan/php-qrcode/blob/main/examples/svg.php)

Set the options:

Expand Down Expand Up @@ -62,13 +64,14 @@ printf('<img alt="%s" src="%s" />', $alt, $out);
| method | return | description |
|---------------------------------------------------|----------|---------------------------------------------------------------|
| (protected) `getCssClass(int $M_TYPE = 0)` | `string` | returns a string with all css classes for the current element |
| (protected) `getViewBox()` | `string` | returns the value for the SVG viewBox attribute |
| (protected) `header()` | `string` | returns the `<svg>` header with the given options parsed |
| (protected) `module(int $x, int $y, int $M_TYPE)` | `string` | returns a path segment for a single module |
| (protected) `path(string $path, int $M_TYPE)` | `string` | renders and returns a single `<path>` element |
| (protected) `paths()` | `string` | returns one or more SVG `<path>` elements |
| (protected) `module(int $x, int $y, int $M_TYPE)` | `string` | returns a path segment for a single module |
## Options that affect this module
## Options that affect this class
| property | type |
|---------------------------|-------------|
Expand All @@ -87,13 +90,3 @@ printf('<img alt="%s" src="%s" />', $alt, $out);
| `$svgPreserveAspectRatio` | `string` |
| `$svgViewBoxSize` | `int\|null` |
| `$svgUseFillAttributes` | `bool` |
### Options that have no effect
| property | reason |
|---------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `$bgColor` | background color can be achieved via CSS, attributes or the `<defs>` element, see also [php-qrcode/discussions/199 (comment)](https://github.com/chillerlan/php-qrcode/discussions/199#discussioncomment-5747471) |
| `$imageTransparent` | SVG is - similar to a HTML element - transparent by default |
| `$returnResource` | N/A |
| `$scale` | `$scale` (pixel size of a qr module) is intended for raster image types, use `$svgViewBoxSize` instead |
104 changes: 104 additions & 0 deletions docs/Built-In-Output/QRMarkupXML.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
# QRMarkupXML

[Class `QRMarkupXML`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/QRMarkupXML.php): [eXtensible Markup Language](https://developer.mozilla.org/en-US/docs/Glossary/XML) (XML) output


## Example

See: [XML example](https://github.com/chillerlan/php-qrcode/blob/main/examples/xml.php)

Set the options:

```php
$options = new QROptions;

$options->outputInterface = QRMarkupXML::class;
$options->outputBase64 = false;
// if set to false, the light modules won't be included in the output
$options->drawLightModules = false;

// assign an XSLT stylesheet
$options->xmlStylesheet = './qrcode.style.xsl';

$options->moduleValues = [
QRMatrix::M_FINDER_DARK => '#A71111', // dark (true)
QRMatrix::M_FINDER_DOT => '#A71111', // finder dot, dark (true)
QRMatrix::M_FINDER => '#FFBFBF', // light (false)
QRMatrix::M_ALIGNMENT_DARK => '#A70364',
QRMatrix::M_ALIGNMENT => '#FFC9C9',
QRMatrix::M_VERSION_DARK => '#650098',
QRMatrix::M_VERSION => '#E0B8FF',
];
```


The XSLT stylesheet `qrcode.style.xsl`:

```XSLT
<?xml version="1.0" encoding="UTF-8"?>
<!-- XSLT style for the XML output example -->
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>
<xsl:template match="/">
<!-- SVG header -->
<svg xmlns="http://www.w3.org/2000/svg"
version="1.0"
viewBox="0 0 {qrcode/matrix/@width} {qrcode/matrix/@height}"
preserveAspectRatio="xMidYMid"
>
<!--
path for a single module
we could define a path for each layer and use the @layer attribute for selection,
but that would exaggerate this example
-->
<symbol id="module" width="1" height="1">
<circle cx="0.5" cy="0.5" r="0.4" />
</symbol>
<!-- loop over the rows -->
<xsl:for-each select="qrcode/matrix/row">
<!-- set a variable for $y (vertical) -->
<xsl:variable name="y" select="@y"/>
<xsl:for-each select="module">
<!-- set a variable for $x (horizontal) -->
<xsl:variable name="x" select="@x"/>
<!-- draw only dark modules -->
<xsl:if test="@dark='true'">
<!-- position the module and set its fill color -->
<use href="#module" class="{@layer}" x="{$x}" y="{$y}" fill="{@value}"/>
</xsl:if>
</xsl:for-each>
</xsl:for-each>
</svg>
</xsl:template>
</xsl:stylesheet>
```


Render the output:

```php
$data = 'https://www.youtube.com/watch?v=dQw4w9WgXcQ';
$out = (new QRCode($options))->render($data); // -> XML, rendered as SVG

printf('<img alt="%s" src="%s" />', $alt, $out);
```

The associated [XML schema](https://www.w3.org/XML/Schema) can be found over at GitHub: [`qrcode.schema.xsd`](https://github.com/chillerlan/php-qrcode/blob/main/src/Output/qrcode.schema.xsd)


## Additional methods

| method | return | description |
|---------------------------------------------------|--------------------|-------------------------------------------|
| (protected) `createMatrix()` | `DOMElement` | creates the matrix element |
| (protected) `row(int $y, array $row)` | `DOMElement\|null` | creates a DOM element for a matrix row |
| (protected) `module(int $x, int $y, int $M_TYPE)` | `DOMElement\|null` | creates a DOM element for a single module |


## Options that affect this class

| property | type |
|---------------------------|----------|
| `$drawLightModules` | `bool` |
| `$outputBase64` | `bool` |
| `xmlStylesheet` | `string` |
Loading

0 comments on commit de3d321

Please sign in to comment.