QR Code Scanner & Restorer

Read, enhance and reconstruct damaged, skewed, low-contrast or partially erased QR codes. Inspect raw payloads with spoofing and link safety analysis before opening. All calculations run locally in your browser.

local only · live filters · mesh calibration · spoofing checks

Example payloadsanalysis demo

Feed a payload directly into the security analyzer to inspect the spoofing checks.

Choose or paste image

Choose an image or drop it here

PNG, JPEG, WebP, GIF or BMP. You can also paste from clipboard (⌘V / Ctrl+V).

{{ imageNote }}

Camera scan {{ cameraLabel }}

Camera is off Nothing is captured until started. Frames are processed in memory and never saved.

{{ cameraError }}

Crop & Perspective

Drag to pan · Ctrl/⌘+wheel to zoom

{{ zoomPercent }}%
Aspect ratio:

Live Enhancement & Decode {{ cropWidth }} × {{ cropHeight }} px

QR Code successfully read! {{ preview(liveDecoded) }}
! QR code not recognized yet. Adjust sliders below or continue to mesh calibration.
Luminance Histogram Otsu threshold: {{ filters.binarize ? 'applied' : otsuThreshold }}
{{ filters.rotate }}°
{{ filters.exposure }} EV
{{ filters.brightness }}
{{ filters.contrast }}%
{{ filters.gamma }}
{{ filters.denoise }}%
{{ filters.sharpness }}%

Mesh Deformation Grid

The grid is the fixed reference — drag the control points to pull the photo straight until every module sits inside one cell. Teal boxes are where the 3 finder squares must land.

Grid lines run the full frame; the quiet-zone margin keeps surrounding photo visible so a point can be dragged outward when the auto-fit lands short.

Grid Geometry Settings

QR read cleanly via mesh warp! {{ preview(meshDecoded) }}
! The code reads as v{{ detectedVersion }} ({{ 17 + detectedVersion * 4 }} modules), but the grid is set to v{{ qrVersion }}. Sampling at the wrong size still decodes — it just isn't your grid doing the reading.
{{ moduleCount }} × {{ moduleCount }} modules
Version
v{{ qrVersion }}
{{ moduleCount }}×{{ moduleCount }} matrix
Estimated Step
{{ estimatedModulePitch }} px
per module pitch

Matrix Verification Stage

Hotkeys: Space Confirm prediction & advance · X Invert color · Navigate modules

Module Inspection · row {{ activeRow }}, col {{ activeCol }}

Reconstructed QR Decoded! Reed-Solomon recovery succeeded. {{ preview(matrixDecoded) }}
{{ currentModuleRepaired ? 'Fixed by QR spec:' : 'Predicted module color:' }}
{{ currentModuleDark ? 'DARK' : 'LIGHT' }} finder / timing pattern — value comes from the spec, not from the photo {{ currentConfidence }}% confidence
Module {{ activeModuleIndex + 1 }} / {{ totalModuleCount }}
Reconstructed Bit Matrix (Click to toggle pixel) {{ verifiedCount }} verified · {{ invertedCount }} inverted · {{ repairedCount }} spec-fixed

{{ cleanQrSvg ? 'Restored Clean QR Code' : 'Decoded Payload' }}

{{ kindLabel }} Analysis

{{ current.risk.level === 'ok' ? '✓' : current.risk.level === 'warn' ? '!' : '✕' }} {{ current.risk.title }} {{ current.risk.detail }}
Decoded Payload
{{ item.label }}
{{ mask(item.value) }} {{ item.value }}

Security Findings{{ current.risk.findings.length }}

{{ item.level === 'danger' ? 'risk' : item.level === 'warn' ? 'check' : 'note' }} {{ item.title }} {{ item.detail }}

Raw Payload Bytes

{{ current.parsed.bytes }} bytes · {{ sourceLabel }}

Session History {{ history.length }}

About QR Scanner & Restorer

A QR code can become unreadable due to blur, extreme angles, uneven shadows, crushed contrast or creased paper. This tool implements a multi-stage restoration workflow entirely in your browser:

1. Continuous Image Preprocessing: Real-time exposure, gamma, contrast and Otsu threshold binarization with live histogram curves. Adjusting sliders immediately tests for readable codes.

2. Piecewise Bilinear Mesh Warping: Standard affine quadrilaterals cannot handle curved or folded paper. Our $3\times 3$ and $4\times 4$ control grids allow you to bend the sampling mesh precisely along paper creases.

3. Assisted Module Verification: Inspects modules with adaptive $3\times 3$ neighbor contrast. As soon as enough modules are confirmed for Reed-Solomon error correction to recover missing codewords, the payload is decoded automatically.

Privacy & Security: No images, video frames or scanned payloads ever leave your browser.