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.
Codes on this photo{{ codes.length }} found
!Codes {{ stickerPair[0] }} and {{ stickerPair[1] }} lead to different content and overlap or touch — that is how a sticker over a real code looks. Check which one belongs here before opening either.
#{{ code.n }} {{ !code.data ? 'not read' : (code.level === 'danger' ? 'risk' : code.level === 'warn' ? 'check' : 'ok') + ' · ' + code.kind }}{{ code.data ? preview(code.data) : code.manual ? 'Marked by hand — crop to it on the next step' : 'Found by its corner squares (v' + code.version + '), not readable yet' }}
Codes that nothing can read are found by their three corner squares; one with a corner torn or covered will not be.
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.
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
{{ meshNote }}
Light-on-dark code: modules are read inverted automatically.
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
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×3 and 4×4 control grids allow you to bend the sampling mesh precisely along paper creases.
3. Assisted Module Verification: Each module is read against a local threshold taken from the 5×5 modules around it, so a shadow across half the code does not flip the dark ones. Finder, timing and alignment patterns are restored from the QR specification rather than read from the photo. After every module you confirm or flip, the matrix is decoded again, so the payload appears as soon as Reed-Solomon error correction can recover the rest.
4. Several codes on one photo: Every code in the picture is found in one pass — the ones a decoder reads, and damaged ones located by their three corner squares. They are listed and outlined on the photo; two different codes overlapping or touching are flagged, since that is how a sticker over a genuine code looks. Damaged codes are restored one at a time, and each keeps its own crop, filters and grid when you switch between them.
Privacy & Security: No images, video frames or scanned payloads ever leave your browser.