Choose, drop or paste an image, or capture one with the camera. Available barcode formats depend on your browser’s BarcodeDetector support.
Runs locally in your browserDrop an image here or choose a local image file
Decoding uses the browser BarcodeDetector capability. The image stays on this device; camera access is requested only when you start it.
Chrome and Edge currently provide the widest BarcodeDetector support. If your browser does not expose it, use a compatible current browser and keep the image local.
Choose an image, drop one on the page, paste one from the clipboard, or start the camera and capture a frame. The decoding runs on the browser's own BarcodeDetector interface, so the picture is not uploaded: in a measured decode session the page sent no request carrying it, and the only external traffic was the site's own analytics.
The formats you get are the ones your browser exposes. The page asks BarcodeDetector.getSupportedFormats() first and requests only the intersection with the list it knows, which is why the same picture can decode in one browser and stay silent in another.
Measured in Chrome 153 on macOS, the exposed formats were QR code, Code 128, Code 39, Code 93, EAN-13, EAN-8, UPC-E, ITF, Data Matrix, Aztec and PDF417. A QR test image, a Code 128, an EAN-13 and a Code 39 decoded to their exact payloads; a UPC-A image came back as EAN 13, because that build exposes no upc_a. Micro QR is not in the list either: a Micro QR symbol was not detected while a normal QR code carrying the same token was.
Two QR codes inside one picture were both returned from a single decode, and the results keep the order the browser reported. Because the decoder belongs to the browser, a browser without BarcodeDetector says so on load and refuses to decode instead of guessing.
The file is read inside the page with FileReader and handed to BarcodeDetector.detect() as an image. Drag-and-drop and pasted images take the same path; a camera capture is drawn onto a canvas and decoded from there. The file has to be an image and has to stay under 15 MB - a 30 MB PNG was refused with a message.
Nothing is uploaded: the picture never becomes part of a request. Pixel size is less of a limit than it looks - a 9000 x 9000 test image decoded in about a second - while a file the browser cannot read as an image is now reported instead of silently doing nothing.
The camera opens only when you press Start camera, and the browser asks for permission at that moment. The frame is decoded when you press Capture & decode, and Stop camera releases the stream and hides the preview; there is no continuous scanning while the video runs.
Every decode starts from scratch, so pressing Decode image twice on the same picture gives the same values, and a decode that finds nothing says so and leaves the list empty. Decoded text is displayed as text: a QR code carrying HTML markup is shown, not rendered.