QR code test data
Deliberately broken QR codes, for testing what a scanner does when a symbol is not perfect. Corrupted data codewords at four severities, format information rewritten to declare the wrong mask, a broken finder pattern, an inverted symbol, a damaged timing pattern, a cleared alignment pattern, a missing corner, and blanked regions at three sizes.
Every case is run through this site's own ISO/IEC 18004 decoder, with real Reed-Solomon correction, and labeled with whether it still reads and how many codewords had to be repaired. That label is the point. A directory of corrupted images tells a tester nothing, because they cannot separate a code their reader SHOULD have managed from one that no reader could — and both failures look identical from the outside.
The download is a ZIP of image fixtures plus a CSV and a JSON manifest recording, per file, what was damaged, how many modules changed, the verdict, the repair cost and the decoded text. An undamaged control goes in first, because without a baseline you cannot tell a strict scanner from a broken corpus. A seed makes the whole set reproducible, so a fixture can be attached to a bug report and regenerated byte for byte later.
What the labels can and cannot claim is stated on the page rather than glossed over. They come from one conforming decoder. A phone may recover an image this one rejects, since it binarises a photograph more aggressively, and it may give up on a damaged finder this one tolerates, since it has to locate the symbol before reading it. A disagreement is worth investigating; it is not automatically a defect on either side.
The useful shape of the corpus is that it spans both outcomes at every error-correction level. Measured on a version 3 symbol: 7 flipped modules still read at level L, 14 at M, 27 at Q and 37 at H — which is the error-correction trade made concrete instead of quoted as a percentage.