Just File Tools

Barcode Reader

Scan UPC, EAN, Code 128, QR, Data Matrix, PDF417 from a camera or image

Drop a photo or screenshot of a barcode. UPC, EAN, Code 128, Code 39, ITF, QR, Data Matrix, PDF417, and more.

Max file size: 50MB

Files are processed in your browser. Nothing is uploaded.

How to Barcode Reader Online

Decode any 1D or 2D barcode (UPC, EAN, Code 128, QR, Data Matrix, PDF417, etc.) from an image or live camera, entirely in your browser.

  1. Pick a mode. 'Upload image' is the default and works best for QR codes embedded in PDFs, shipping label screenshots, photographed product barcodes.
  2. Drop an image (image upload) OR click 'Start camera and scan' (live camera). The first run lazy-loads ZXing (~200 KB).
  3. The decoder identifies the format automatically and shows the decoded text. URL-shaped results get an 'Open in new tab' shortcut.
  4. Copy the result, then close the tab or stop the camera. The camera light goes off the instant a code is detected.

About Barcode Reader

Reading a barcode used to be a hardware problem. You needed a scanner — a laser scanner for 1D codes, a 2D imager for QR and Data Matrix. Now it's a software problem with a known answer: ZXing, an open-source multi-format barcode decoder originally written at Google for Android in 2008. It's been the de-facto barcode decoder in the open-source ecosystem for over a decade and has been ported to nearly every language. The JavaScript port — <strong>@zxing/library</strong> — runs entirely in a browser tab and handles every common format.

This tool wraps it. Drop an image or use your camera; the decoder figures out which of the dozen-plus supported formats your input is in and returns the encoded text. The browser-only execution matters because barcode payloads can be sensitive: a Wi-Fi credentials QR, a shipping tracking number that's tied to a specific delivery address, a library card barcode, a payment authorization token. Sending any of those to a remote decoder service is the wrong tradeoff if you can avoid it.

**Formats supported** (the full ZXing list):

- **1D / linear:** UPC-A, UPC-E (US retail), EAN-8, EAN-13 (international retail), Code 39 (industrial / asset tags), Code 93 (compressed variant of 39), Code 128 (modern general-purpose), Codabar (libraries, blood banks), ITF / ITF-14 (shipping cartons), RSS-14 / RSS Expanded / GS1 DataBar (small package labels). - **2D / matrix:** QR Code, Data Matrix, PDF417, Aztec, MaxiCode.

The decoder picks the format itself — you don't have to know in advance. Drop a UPC photo and you get UPC text out; drop a QR screenshot and you get QR text out. ZXing's identification is reliable because each format has a distinct visual signature (start patterns, quiet zones, module shapes) that the decoder checks before attempting to read content.

**Two modes**:

- **Image upload** — the default and the more reliable option for most real-world cases. Drop a photo or screenshot, the decoder reads it once with full attention. Works on anything the camera could see, plus things the camera can't easily reach (screenshots of PDF barcodes, image attachments in email). - **Live camera** — useful when you have a physical barcode in front of you and a webcam handy. The decoder runs continuously on each video frame; the first successful decode stops the camera and shows the result.

**Performance**:

- First use: lazy-loads ~200 KB of ZXing into your browser cache. ~1 second on a decent connection. - Subsequent decodes in the same session: instant. The library is in memory. - Image decode: typically under 100 ms per image. - Live camera decode: continuous frame analysis, usually finds a barcode within 1-3 seconds of pointing the camera.

**Comparison with the QR Reader on this site**: the <a href="/tools/qr-reader">QR Code Reader</a> uses **jsQR** which is QR-only and about 50 KB. If you specifically want to decode QR codes, that's the lighter and slightly faster option. This Barcode Reader uses ZXing and supports all the other formats too. Rule of thumb: use the QR Reader if you know it's a QR; use this Barcode Reader if you don't know what format it is or it definitely isn't QR.

**The image-quality dependencies**:

- **Resolution.** The narrowest module in the barcode needs to be at least 2–3 pixels wide in the image. For a typical 1D barcode that means the image needs to be at least 600 pixels wide. For dense 2D codes (long PDF417 strings), 1200+ pixels works much better. - **Focus.** Out-of-focus barcodes are usually unreadable — the bar/space boundaries become gradients instead of sharp transitions. Refocus and retake. - **Lighting / contrast.** Most decoders need ~70% contrast between dark and light. Low-light photos work but are slower; very low contrast (faded labels, washed-out screens) may fail. - **Angle.** ZXing tolerates moderate angle (up to ~30° from perpendicular). Severe angle or perspective distortion can defeat the decoder.

**What this tool does deliberately not do**:

- **Multi-barcode decode from one image.** Single result per scan. Crop to one barcode at a time. - **Encoded-format conversion** (e.g., decoded UPC → looked-up product name). The decoded text is the barcode's literal content; product lookups need a separate API and database. - **Damaged / partial barcode recovery beyond what ZXing's error-correction natively handles.** If the bars are heavily occluded or the QR has significant tear damage, you may need specialized recovery tooling.

**Privacy**. The whole point of this tool's existence is to decode barcodes without uploading them. ZXing runs in your browser as a JavaScript library. The image you upload, the camera stream you scan, the decoded value — none of it crosses the network. The only network traffic is the one-time fetch of the ZXing library on first use, which is a public library, identical for every visitor. Verify in DevTools — open the Network panel and watch it stay empty during scans.

Frequently Asked Questions

Which barcode formats does it decode?

All the formats ZXing supports, which is essentially every common 1D and 2D format: UPC-A, UPC-E, EAN-8, EAN-13 (retail); Code 39, Code 93, Code 128, ITF (industrial / shipping); Codabar (libraries / blood banks); QR Code, Data Matrix, PDF417, Aztec (2D); RSS-14, RSS Expanded (databar). Drop an image or point the camera at any of these; the decoder figures out the format automatically.

How is this different from the QR Code Reader?

The <a href="/tools/qr-reader">QR Code Reader</a> uses jsQR (~50 KB, QR-only) and is the lightweight option for the QR-only case. This Barcode Reader uses ZXing (~200 KB) and supports every format ZXing knows about. If you specifically want to decode QR codes, the QR Reader is faster to load and equally accurate; if you want to decode anything that might or might not be a QR (retail barcodes, shipping labels, library catalog barcodes), this is the right tool.

Why is image upload sometimes better than live camera?

Three reasons. **Still images give the decoder more time per frame** — live camera scans in real-time with limited compute per attempt, while a still image gets full attention. **You can pick the best frame** — photograph the barcode from the best angle and lighting, then upload, instead of trying to get the live feed to a good moment. **Some screenshots can't be re-photographed** — a barcode embedded in a PDF or shown on a screen across the room is easier to screenshot than to point a camera at.

Why does scanning sometimes fail?

Three common causes. **Low resolution** — if individual bars in the barcode are less than a few pixels wide in the image, the decoder can't distinguish them. **Blurred or out-of-focus image** — common with phone photos taken too close or in motion. **Severe perspective distortion** — a barcode photographed at a sharp angle can be unrecoverable. Try a higher-resolution photo or a cleaner screenshot.

Can I scan multiple barcodes from one image?

Not in this version. ZXing's single-decode mode returns the first barcode it finds. For images with multiple barcodes (a delivery slip with separate UPC and shipping codes), crop to one barcode at a time.

What happens to my image during scanning?

Nothing leaves your tab. ZXing runs as JavaScript in your browser. The image is read into memory locally, the decoder walks the pixels in-tab, and the decoded text is shown in the result panel. Same with the live camera mode — the camera stream stays local. No upload, no cloud OCR, no third-party service.