> For the complete documentation index, see [llms.txt](https://infinitode-docs.gitbook.io/documentation/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://infinitode-docs.gitbook.io/documentation/package-documentation/qrforge-package-documentation/qrforge-gallery.md).

# qrforge Gallery

A visual tour of qrforge: every built-in preset plus gradients, shapes, eyes, shaders, logos, textures, cards and transparency, rendered from real code and verified as scannable.

Every image on this page is a **real, unedited PNG produced by qrforge 1.0.1** — there are no mock-ups, no touch-ups and no external image tools. Each file is exactly what `qr.save("…png")` wrote through qrforge's own dependency-free PNG codec, using the named preset or the style options shown with it.

All symbols encode the same payload, `https://github.com/Infinitode/qrforge`, at error correction level `H` (30% recovery), so the styles are directly comparable.

{% hint style="info" %}
**These codes really scan.** Each image was checked twice: `qr.verify()` decoded the module matrix, and the saved PNG was then decoded again by an *independent* scanner ([zxing-cpp](https://github.com/zxing-cpp/zxing-cpp), the C++ port of ZXing used by many phone scanners). Raster output was flattened onto white first, exactly as a camera sees a printed symbol. The [regeneration script](#regenerating-the-gallery) below repeats both checks.
{% endhint %}

***

## Preset gallery

All 22 built-in [presets](/documentation/package-documentation/qrforge-package-documentation/qrforge-reference/qrforge-presets-and-outputs.md#presets), each rendered from three lines of code:

```python
import qrforge

qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h")
qr.use_style("neon")
qr.save("preset-neon.png", scale=10)
```

{% hint style="info" %}
The one-line shortcut `qrforge.save(data, path, "neon", scale=10)` is fine for quick output, but it treats every keyword as a *style* option and always encodes at error correction level `M`. Properties of the code itself — `ec`, `version`, `mask`, `mode` — only exist on `qrforge.QR(...)`, so use the three-line form when you need them.
{% endhint %}

|                                           [`classic`](/documentation/package-documentation/qrforge-package-documentation/qrforge-reference/qrforge-presets-and-outputs.md#presets)                                          |                                                                                                         `dots`                                                                                                        |                                                                                                          `rounded`                                                                                                          |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![classic preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-5346e4c84349fd738a8c47578c806ba98163539e%2Fpreset-classic.png?alt=media) | ![dots preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-0814f07ace319ce976e65e57a35494ff46c9e2ed%2Fpreset-dots.png?alt=media) | ![rounded preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-681d22bcd13c33d399d73ed57673533cd2cc55f8%2Fpreset-rounded.png?alt=media) |

|                                                                                                         `soft`                                                                                                        |                                                                                                           `confetti`                                                                                                          |                                                                                                         `neon`                                                                                                        |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![soft preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-f6426318bd088bcd51262dfa0b7237ec0e210946%2Fpreset-soft.png?alt=media) | ![confetti preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-bb07de730e12944c4a7ba3ea4990e2f177238f9e%2Fpreset-confetti.png?alt=media) | ![neon preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-afbcbd971cac685dea8055d7e7d9d5c9468e6afa%2Fpreset-neon.png?alt=media) |

|                                                                                                          `sunset`                                                                                                         |                                                                                                           `blueprint`                                                                                                           |                                                                                                          `brutal`                                                                                                         |
| :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![sunset preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-b6cbd80282341baa657e9191a84afbda927e02a2%2Fpreset-sunset.png?alt=media) | ![blueprint preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-5805757b46a8fb27b35ef2b50ea965def2e056bc%2Fpreset-blueprint.png?alt=media) | ![brutal preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-b063f5befc1c3443abc104a10457dbdb1a643154%2Fpreset-brutal.png?alt=media) |

|                                                                                                         `vapor`                                                                                                         |                                                                                                         `film`                                                                                                        |                                                                                                           `halftone`                                                                                                          |
| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![vapor preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-2c99faa24318055c43c6d1bf50e4aad1c2bc23fc%2Fpreset-vapor.png?alt=media) | ![film preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-90e6ee2aa0c387bbd417aa508cb3de23405eba4c%2Fpreset-film.png?alt=media) | ![halftone preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-cce6086695c267dfaa42ced24a19089483aed171%2Fpreset-halftone.png?alt=media) |

|                                                                                                         `gold`                                                                                                        |                                                                                                        `ice`                                                                                                        |                                                                                                         `leaf`                                                                                                        |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![gold preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-9ba420d7cc8b1cb76493850a139c96bf0ee5ef08%2Fpreset-gold.png?alt=media) | ![ice preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-7bbdaf0a83f9e5bf5779339bb1d1b28d8f21979d%2Fpreset-ice.png?alt=media) | ![leaf preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-968de4814c11bb8c66c938e77afb58925935bc18%2Fpreset-leaf.png?alt=media) |

|                                                                                                          `circuit`                                                                                                          |                                                                                                         `retro`                                                                                                         |                                                                                                          `glitch`                                                                                                         |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![circuit preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-68d551e8b6470fdb81e66ef13e761af354178a34%2Fpreset-circuit.png?alt=media) | ![retro preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-92d4f789e8f27221eb87a656fc39dc4497d37bd1%2Fpreset-retro.png?alt=media) | ![glitch preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-3321c703ca241956ab47be9041c32b604a0ef2a2%2Fpreset-glitch.png?alt=media) |

|                                                                                                          `minimal`                                                                                                          |                                                                                                         `badge`                                                                                                         |                                                                                                          `starry`                                                                                                         |
| :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: |
| ![minimal preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-c15b31072204ac5d43f5815470ff12dfd2bfb6f4%2Fpreset-minimal.png?alt=media) | ![badge preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-59747400aeb2780b754bebc67e2037ae670749f6%2Fpreset-badge.png?alt=media) | ![starry preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-2685e5ed1458a1da4237b18001c15ba4cf5622d2%2Fpreset-starry.png?alt=media) |

|                                                                                                         `cross`                                                                                                         |     |     |
| :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------: | :-: | :-: |
| ![cross preset](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-ad27aa4b6b93101c30bc4f3618d11452e9b04a2c%2Fpreset-cross.png?alt=media) |     |     |

{% hint style="info" %}
The gallery nudges one knob per preset: `leaf` uses `eye_dot_shape="dot"` (the preset's leaf-shaped eye dots are too pointed for strict finder-pattern detection) and `halftone` renders at `scale=12` (the shader shrinks the modules, so a larger scale keeps the halftone dots crisp). Both are one-line overrides — `use_style("leaf", eye_dot_shape="dot")`.
{% endhint %}

***

## Colours and gradients

### Linear gradient

A list of colours becomes a linear gradient; the dict form sets the direction and explicit stop positions.

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="dot", module_scale=0.92,
    fg={"kind": "linear", "angle": 45,
        "colors": [(0.0, "#ff9a3c"), (0.5, "#ff4d6d"), (1.0, "#7b2ff7")]},
    bg="#10061f", eye_shape="rounded", eye_dot_shape="rounded")
qr.save("feature-linear-gradient.png", scale=10)
```

![Linear gradient QR code](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-5b9e34e94eee9859fc59f26c3a275b37328aa5a8%2Ffeature-linear-gradient.png?alt=media)

### Radial gradient

`center`, `radius` and `inner` control the geometry; the eyes get their own colour with `eye_fg`.

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="rounded", module_radius=0.3,
    fg={"kind": "radial", "center": (0.5, 0.35), "radius": 0.8,
        "colors": ["#ffffff", "#7ab8ff", "#1f6feb"]},
    bg="#050b1c", eye_fg="#8ef6ff", eye_shape="rounded", eye_dot_shape="rounded")
qr.save("feature-radial-gradient.png", scale=10)
```

![Radial gradient QR code](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-9f6d7d99247359eb04dbb3c0092250588373d2a6%2Ffeature-radial-gradient.png?alt=media)

### Conic gradient

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="dot", module_scale=0.9,
    fg={"kind": "conic", "start_angle": 90,
        "colors": ["#ff71ce", "#01cdfe", "#05ffa1", "#b967ff", "#ff71ce"]},
    bg="#1a0b2e", eye_shape="circle", eye_dot_shape="circle")
qr.save("feature-conic-gradient.png", scale=10)
```

![Conic gradient QR code](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-203c976934add3f2b80f63e383349090ade213da%2Ffeature-conic-gradient.png?alt=media)

***

## Shapes

### Random per-module mix

Pass a list of shapes to pick one per module; `seed` makes the mixture reproducible and `module_jitter` varies each module's size and rotation.

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape=["dot", "star", "hexagon"], module_scale=0.9,
    module_jitter=0.12, seed=3, fg=["#00c6ff", "#0072ff"], bg="#08111f",
    eye_shape="rounded", eye_dot_shape="rounded")
qr.save("feature-shapes.png", scale=10)
```

![Mixed module shapes QR code](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-91b6fa9666cfa46a1106ff0a7763e9edc62c78df%2Ffeature-shapes.png?alt=media)

### Custom SDF shape

Any signed distance field in module units can be registered and used by name.

```python
import math
import qrforge

@qrforge.shape("wave")
def wave(x, y, radius=0.0):
    return qrforge.shapes.sd_circle(x, y + 0.08 * math.sin(x * 9), 0.5)

qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="wave", fg=["#ffe066", "#ff6b6b"], bg="#1b1220",
    eye_shape="rounded", eye_dot_shape="rounded")
qr.save("feature-custom-sdf.png", scale=10)
```

![Custom SDF module shape QR code](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-a7427ddae0d3bd1843707f8fdfaebfbaaa261e6e%2Ffeature-custom-sdf.png?alt=media)

***

## Eyes

The three finder patterns are styled independently of the data modules. Here the ring is a circle, the centre dot keeps its own shape, and `eye_fg` colours both magenta while the modules stay near-black.

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="dot", module_scale=0.9, fg="#0f172a", bg="#fdf2f8",
    eye_shape="circle", eye_dot_shape="dot", eye_fg="#ff0080")
qr.save("feature-eyes.png", scale=10)
```

![QR code with custom finder patterns](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-b42f2751ec2e8230cd3670d3d0929a2110b3d3b8%2Ffeature-eyes.png?alt=media)

***

## Shaders

Shaders stack in order after the symbol is rasterised. This render combines three of them: a glow bloom, film grain and a wave warp.

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="rounded", module_radius=0.28,
    fg=["#00f0ff", "#7b2ff7", "#ff2ec4"], bg="#0a0118",
    shaders=["glow:radius=2,amount=0.75", "grain:amount=0.06",
             "wave:amplitude=4,wavelength=36"],
    eye_shape="rounded", eye_dot_shape="rounded")
qr.save("feature-shaders.png", scale=10)
```

![QR code with glow, grain and wave shaders](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-9bb5e736be96d4f6a32f3b65e50d868da2ad869f%2Ffeature-shaders.png?alt=media)

Every shader is available in SVG output when it has an equivalent — the [Presets & Outputs](/documentation/package-documentation/qrforge-package-documentation/qrforge-reference/qrforge-presets-and-outputs.md#shader-coverage-per-output) reference lists which ones are raster-only.

***

## Logos

A logo carves a knockout zone out of the modules, with an optional background, stroke and rounded or circular shape. Logos always go with `ec="h"`.

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="rounded", module_radius=0.3, module_scale=0.96,
    fg=["#ff0080", "#7928ca"], bg="#ffffff",
    logo="logo.png", logo_size=0.22, logo_shape="circle",
    logo_bg="#ffffff", logo_stroke=("#7900ff", 0.18),
    eye_shape="rounded", eye_dot_shape="rounded")
qr.save("feature-logo.png", scale=12)
```

![QR code with a circular logo knockout](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-785c9e875aa88ccee42b9917eeea3a27c7d1dec8%2Ffeature-logo.png?alt=media)

***

## Textures

A texture is painted *inside* the dark modules instead of a flat colour. Here a rainbow noise image is multiplied into square modules.

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="square", texture="texture.png", texture_mode="cover",
    texture_blend="multiply", texture_opacity=0.95, bg="#ffffff")
qr.save("feature-texture.png", scale=12)
```

![QR code with an image texture inside the modules](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-794c1e86c2add987dffbae766a62003cba445ead%2Ffeature-texture.png?alt=media)

***

## Backgrounds, cards and shadows

`bg`, `padding`, `bg_radius` and `shadow` turn a symbol into a card or sticker.

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="rounded", module_radius=0.3, module_scale=0.94,
    fg="#111827", bg="#fff6ec", padding=2, bg_radius=0.06,
    shadow={"color": "#0b1020", "dx": 2, "dy": 6, "blur": 5, "opacity": 0.25},
    eye_shape="rounded", eye_dot_shape="rounded")
qr.save("feature-card.png", scale=12)
```

![QR code on a rounded card with a drop shadow](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-dc859415a3ccfd803c92281ec7acc0868f1b013b%2Ffeature-card.png?alt=media)

***

## Transparency

`bg=None` writes a transparent PNG. The code below is shown on white by your browser; place it on any surface that gives the gradient enough contrast.

```python
qr = qrforge.QR("https://github.com/Infinitode/qrforge", ec="h").use_style(
    module_shape="dot", module_scale=0.92, bg=None,
    fg={"kind": "linear", "angle": 135, "colors": ["#00c6ff", "#0072ff"]},
    eye_shape="rounded", eye_dot_shape="rounded")
qr.save("feature-transparent.png", scale=10)
```

![QR code with a transparent background](https://3257474019-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FFbya6xCbCOMkITeJrPUp%2Fuploads%2Fgit-blob-633d2e39423fd98006bf1326d75c812cc8273343%2Ffeature-transparent.png?alt=media)

{% hint style="info" %}
Rendered artwork is RGBA. PNG and SVG keep the alpha channel; for JPEG, convert first: `qr.to_pil().convert("RGB").save("out.jpg")`.
{% endhint %}

***

## Regenerating the gallery

The images are reproducible. This is the loop behind the preset section of the page, plus one feature render at the end — every other feature image uses the same pattern with the options shown above it. Presets are written at 10 pixels per module (12 for `halftone`, where the shader shrinks the dots) and verified as they go.

```python
import math
import qrforge

PAYLOAD = "https://github.com/Infinitode/qrforge"
SCALE = 10

# 1. every built-in preset, one PNG each
for name in qrforge.presets.names():
    qr = qrforge.QR(PAYLOAD, ec="h").use_style(name)
    if name == "leaf":
        qr.use_style(eye_dot_shape="dot")      # pointed eye dots confuse scanners
    qr.save(f"preset-{name}.png", scale=12 if name == "halftone" else SCALE)
    assert qr.verify() == PAYLOAD


# 2. custom shapes are registered once and then usable by name
@qrforge.shape("wave")
def wave(x, y, radius=0.0):
    return qrforge.shapes.sd_circle(x, y + 0.08 * math.sin(x * 9), 0.5)


qr = qrforge.QR(PAYLOAD, ec="h").use_style(
    module_shape="wave", fg=["#ffe066", "#ff6b6b"], bg="#1b1220",
    eye_shape="rounded", eye_dot_shape="rounded")
qr.save("feature-custom-sdf.png", scale=SCALE)

# 3. check any styling decision before you ship it
assert qr.verify() == PAYLOAD, "the symbol no longer scans"
```

`qr.verify()` re-decodes the module matrix with qrforge's bundled decoder. To also prove that the *rendered pixels* scan, feed the saved file to an independent reader — for example [zxing-cpp](https://pypi.org/project/zxing-cpp/) (install it separately; qrforge itself stays dependency-free):

```python
import cv2
import zxingcpp

PAYLOAD = "https://github.com/Infinitode/qrforge"

image = cv2.imread("feature-custom-sdf.png", cv2.IMREAD_UNCHANGED)
if image.shape[2] == 4:                       # flatten RGBA onto white
    alpha = image[:, :, 3:4].astype("float32") / 255.0
    image = (image[:, :, :3] * alpha + 255.0 * (1.0 - alpha)).astype("uint8")

result = zxingcpp.read_barcode(image)
assert result.valid and result.text == PAYLOAD
```

{% hint style="warning" %}
Styling can eat error correction budget. Keep the quiet zone at `4` modules, keep `ec="h"` when you cover modules with a logo or texture, and verify every symbol at the scale you intend to publish.
{% endhint %}

***

## See also

* [qrforge Package Documentation](/documentation/package-documentation/qrforge-package-documentation.md) — installation, features and changelog.
* [qrforge Usage Examples](/documentation/package-documentation/qrforge-package-documentation/qrforge-usage-examples.md) — runnable recipes for every feature shown above.
* [Presets & Outputs](/documentation/package-documentation/qrforge-package-documentation/qrforge-reference/qrforge-presets-and-outputs.md) — what each preset does and every file format.
* [Style Options](/documentation/package-documentation/qrforge-package-documentation/qrforge-reference/qrforge-style-options.md) — the full list of knobs used in these examples.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://infinitode-docs.gitbook.io/documentation/package-documentation/qrforge-package-documentation/qrforge-gallery.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
