📷 Barcode Scanner - Read QR & Barcodes from Camera or Image

📷 Scan source

⚠️ Live camera is unavailable in this browser. Image file scanning still works.

📹 Camera

Camera is off
🔍 Scanning live…

Hold a barcode or QR code steady inside the frame. Results appear automatically.

🖼️ Image

📁

Click, drag & drop, or paste an image
JPG, PNG, GIF, WebP, BMP — up to 15MB

{{ selectedFile.name }}
{{ formatFileSize(selectedFile.size) }}
🔎 No code found automatically. Drag a box over the barcode below to scan just that area.
Tip: drag a box over any code to rescan just that region.
Selected image to scan

⚙️ Scanner settings

Try every supported symbology (default).

📊 Scan results

📷

No barcodes scanned yet

Use the camera or upload an image to start scanning

🔍

Scanning…

{{ result.format }}
{{ result.source }}
{{ result.text }}
{{ new Date(result.timestamp).toLocaleTimeString() }}

📈 Session stats

Total scans
{{ scanResults.length }}
Unique codes
{{ uniqueCount }}
Most common format
{{ mostCommonFormat }}

💾 Export results

⚠️

ℹ️ About Barcode Scanner

Barcode scanning turns the bars, spaces, or square modules in a camera frame or image file back into the encoded value. Linear (1D) barcodes such as UPC, EAN, Code 128, and Code 39 encode data along one axis; 2D symbols such as QR Code, Data Matrix, Aztec, and PDF417 use a matrix pattern and carry more data with built-in error correction. This scanner decodes both families entirely in your browser — no upload, no server round-trip. For retail and supply-chain identifiers, GS1 documents the common barcode families and data rules in its barcode standards and General Specifications.

How to scan

  • Camera: point your device's camera at the code. The scanner reads continuously and reports the value the moment it locks on — no shutter button needed.
  • Image file: drop in, paste, or pick a photo or screenshot. The tool first tries to find a code anywhere in the picture automatically.
  • Drag-to-select a region: if auto-detection misses (busy background, several codes, glare, or a tiny symbol), drag a box directly over the barcode in the preview to decode just that area.

Supported barcode types

The browser engine (a JavaScript port of the ZXing "zebra crossing" library) decodes a wide range of symbologies:

By default every format is tried at once. Narrow the list in Scanner Settings if you know the symbology — it speeds up decoding and avoids look-alike misreads.

Examples

  • EAN-13 product code: scanning 4006381333931 returns the 13-digit retail identifier printed below the bars.
  • UPC-A product code: scanning 036000291452 returns the 12-digit identifier common on North American packaging.
  • Code 128 label: scanning SHIP-2026-000184 returns the alphanumeric shipment or asset value.
  • QR code: scanning a Wi-Fi or URL QR returns the embedded text, e.g. https://onlinecybertools.com.

Tips for reliable decoding

  • Include the quiet zone: when dragging a region, leave a little white space on each side of the code — most symbologies require it.
  • Avoid glare and blur: flat, evenly lit, in-focus images decode best; curved packaging and motion blur are the usual culprits when a scan fails.
  • Use Try harder: enabled by default, it spends extra effort on rotated, low-contrast, or partially damaged codes.
  • Decoding is not a registry lookup: a decoded UPC/EAN identifies the number in the barcode; it does not query GS1 or any product database.

Browser scanner vs. API

The on-page scanner (camera, image upload, and drag-to-select) runs the ZXing engine in your browser and covers the full list above, including Data Matrix, Aztec, PDF417, and Micro QR. A separate, optional endpoint — POST /api/tools/osint/barcode-scanner — decodes an uploaded image server-side with the zbar engine for automation and scripts. The server engine covers a slightly smaller set: EAN-13/8, UPC-A/E, ISBN-10/13, Code 128/39/93, Codabar, ITF, GS1 DataBar (and Expanded), QR Code, and SQ Code. Data Matrix, Aztec, PDF417, MaxiCode, and Micro QR are browser-only. The decode is offloaded to a remote network worker when one is available, with a local fallback otherwise.

Camera and image privacy

Browser scanning is local. When you use the camera or the in-page image scanner, frames and images are decoded entirely in your browser with the bundled ZXing engine — nothing is uploaded, and the page's scanner never calls the server API. Camera access starts only after you grant browser permission. The opt-in /api/tools/osint/barcode-scanner endpoint is the one exception: an image you explicitly send to it is uploaded so it can be decoded server-side. Avoid scanning sensitive badges, IDs, or tickets on shared devices, and revoke the site's camera permission when you are done.

API Usage Example:

Decode a barcode/QR from an image server-side (zbar). Upload a file, or post a base64-encoded image as JSON. Optional formats narrows the symbologies tried.

# multipart upload (field "image")
curl -X POST /api/tools/osint/barcode-scanner \
  -F "[email protected]" \
  -F "formats=qr_code,code_128"

# or JSON with a base64 (or data: URI) image
curl -X POST /api/tools/osint/barcode-scanner \
  -H "Content-Type: application/json" \
  -d '{"image":"<base64-encoded-image>","formats":["ean_13","qr_code"]}'
Ready