条形码 / 一维码解析
浏览器 BarcodeDetector API · 识别 EAN / UPC / Code 128 等 13 种格式
上传图片解析条码
浏览器 BarcodeDetector API · 识别 EAN / UPC / Code 128 等 13 种格式
· 完美支持:Chrome 88+ / Edge 88+ / Android Chrome 88+ / Opera 74+
· 部分支持:Safari 17+(iOS 17+)— 仅部分格式
· 不支持:Firefox(不计划实现)/ 老版 Safari
· 支持的格式:QR / EAN-13 / EAN-8 / UPC-A / UPC-E / Code 128 / Code 39 / Code 93 / Codabar / ITF / DataMatrix / PDF417 / Aztec
· 本地解析:所有图片在浏览器本地识别,不上传任何服务器
了解工具定位 · 使用场景 · 对比优势
上传一张包含条形码的图片,工具自动识别并输出条码内容(数字或字符)。电商仓库扫码核对商品、物流人员录入运单号、图书管理员盘点库存时,无需专用扫描枪,用手机或电脑拍照即可。图片完全在本地浏览器处理,不发送到任何服务器。
仓储管理员每天需扫描几百个商品条码录入系统,遇到条码磨损、褶皱、反光导致扫描枪失效时,用手机拍下条码图片上传至本工具,即可自动解析出完整商品编号,避免人工手动补录的差错与耗时,入库效率提升 3 倍以上。
电商客服收到买家退回的商品,外包装条码已模糊或被胶带覆盖,无法直接扫码。用本工具解析条码图片,快速获取原商品 SKU、批次号,匹配退货订单,无需拆箱或手动查找,单次退货处理时间从 5 分钟缩短至 30 秒。
个体店主盘点时发现部分商品条码因扫描枪接触不良未入库,但小票上的条码清晰可辨。用手机拍下小票条码区域,上传本工具解析出商品编码,手动补录进库存系统,无需重新翻找实物,盘点准确率提升至 99.5%。
产品经理在开发新包装时,需确认印刷的 EAN-13 条码是否符合标准。将设计稿中的条码截图上传本工具,解析结果会显示校验位是否正确、编码结构是否合规,避免因条码错误导致产品上架后被超市拒收,节省打样返工成本。
二手平台买家看到商品图上的条码,想查该商品全新价以判断二手价是否合理。截取条码区域上传本工具,解析出商品编码后,可自行搜索比价,避免因条码模糊而手动输入错误编码,比价效率提升 80%。
| 维度 | 本工具 | 竞品 A: ZXing Decoder Online | 传统方法 |
|---|---|---|---|
| 数据隐私 | 纯浏览器端处理,图片不上传服务器 | 图片上传至服务器解码 | 需将图片交给第三方人员或机构 |
| 处理速度 | 本地解码,通常在1秒内返回结果 | 取决于网络和服务器负载,通常3-10秒 | 人工识别或使用专用扫描设备,耗时数分钟至数小时 |
| 离线可用 | 完全离线,无需网络连接 | 必须联网使用 | 通常无需网络,但依赖专用硬件 |
| 图片格式支持 | 常见格式如 PNG、JPG、WEBP、BMP | 主要支持 PNG、JPG | 受限于扫描设备,通常只支持特定格式 |
| 批量处理 | 单张图片处理 | 单张图片处理 | 可连续扫描,但需人工操作 |
| 解码类型 | 一维码(Code128, EAN-13等)和二维码(QR Code等) | 一维码和二维码 | 通常只能解码单一类型(如仅二维码或仅一维码) |
上手步骤 · 输入输出 · 避坑提示
| 输入 | 输出 | 说明 |
|---|---|---|
| 一张包含EAN-13条形码的商品包装图片 | 6901234567890 | 典型场景:超市商品条码解析 |
| 一张包含Code 128条形码的快递面单图片 | SF1234567890 | 常见场景:物流单号条码解析 |
| 一张包含QR码的电子票截图 | https://example.com/ticket/ABC123 | 边界case:二维码(QR码)也属于条形码 |
| 一张模糊的条码图片(分辨率低或有污渍) | 解析失败:条码无法识别 | 易错case:低质量图片导致解析失败 |
| 一张包含多个条码的图片(如商品包装上同时有EAN-13和QR码) | 6901234567890 | 边界case:多码共存时仅解析第一个有效条码 |
| 一张不含任何条码的普通照片 | 未检测到条形码 | 易错case:用户误上传无条码图片 |
| 一张包含UPC-A条码的美国进口商品图片 | 012345678905 | 典型场景:UPC-A格式自动识别 |
上传一张微信二维码截图上传包含 Code 128 / EAN-13 / UPC-A 等条形码的图片二维码(QR Code)是矩阵式二维条码,条形码是一维黑白条纹;该工具只解析一维条形码,上传二维码会返回空结果或错误
用 32×32 像素的缩略图,条纹模糊成一团确保条形码区域至少 200 像素宽,黑白条纹清晰可辨条形码解析依赖条纹的明暗对比和宽度比例;分辨率过低时相邻条纹合并,算法无法区分字符边界
截取商品包装上条形码的一小段条纹上传包含完整条形码(含两侧空白区)的整张图片条形码两侧的静区(quiet zone)用于定位起始/终止符;缺少静区或条纹不完整会导致解码失败或错误匹配
用广角镜头从侧面拍摄,条形码呈梯形将条形码正对镜头,保持平行于画面边缘一维条码解析依赖条纹的平行和等宽特性;透视变形会改变条纹间距比例,算法无法正确解码
上传 .webp 或 .heic 格式的条形码照片上传 .jpg / .png / .bmp 格式的图片该工具前端处理仅支持常见栅格格式;WebP 和 HEIC 需额外解码库,浏览器原生不支持直接读取像素数据
在塑料包装上拍摄,条形码区域有强光反射在均匀漫射光下拍摄,避免直射光斑和深色阴影反光区域使条纹亮度反转,阴影降低对比度;二值化阈值算法会误判条纹边界,导致解码错误
条形码上叠加了促销文字或品牌 Logo使用干净、无覆盖的条形码图片文字和图案会改变局部像素值,干扰条纹检测算法;部分解码库会将其误识别为条纹,产生错误字符
从电商详情页截取条形码图片直接上传实物拍摄的条形码照片屏幕截图经过缩放和 JPEG 压缩,条纹边缘产生锯齿和色块;原始照片保留更准确的条纹宽度信息
公式推导 · 流程图解 · 依据出处
无单一数学公式;核心为条码符号编码规则(如 EAN-13 校验位计算:C = 10 - ( (3×奇数位和 + 偶数位和) mod 10 ) mod 10)
C — 校验位(0-9)奇数位和 — 从右向左第1、3、5…位数字之和偶数位和 — 从右向左第2、4、6…位数字之和EAN-13 条码 690123456789X,前12位为 690123456789。奇数位(从右起第1位9、第3位7、第5位5、第7位3、第9位1、第11位9):9+7+5+3+1+9=34;偶数位(第2位8、第4位6、第6位4、第8位2、第10位0、第12位6):8+6+4+2+0+6=26。3×34+26=128,128 mod 10=8,10-8=2,校验位 C=2,完整条码为 6901234567892。
适用于 EAN-13 / UPC-A 等标准条码校验位计算;不适用于 Code 128、QR Code 等非数字编码或已含校验位的条码。规则来源:GS1 General Specifications。
3 种主流语言 · 复制即用
import cv2
import numpy as np
from pyzbar.pyzbar import decode
# 读取图片(支持 PNG/JPEG/BMP)
img = cv2.imread('barcode.png')
if img is None:
raise FileNotFoundError('图片读取失败,请检查路径')
# 解码所有条码
detected = decode(img)
if not detected:
print('未识别到条码')
else:
for obj in detected:
# obj.data 是 bytes,解码为字符串
barcode_data = obj.data.decode('utf-8')
barcode_type = obj.type # 'CODE128', 'EAN13', 'QRCODE' 等
print(f'类型: {barcode_type}, 内容: {barcode_data}')
# 绘制矩形标记条码位置
pts = obj.polygon
if len(pts) == 4:
pts = [(p.x, p.y) for p in pts]
cv2.polylines(img, [np.array(pts, np.int32)], True, (0, 255, 0), 2)
cv2.imshow('Result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()package main
import (
"fmt"
"image"
_ "image/jpeg"
_ "image/png"
"os"
"github.com/makiuchi-d/gozxing"
"github.com/makiuchi-d/gozxing/common"
"github.com/makiuchi-d/gozxing/oned"
)
func main() {
// 打开图片文件
file, err := os.Open("barcode.png")
if err != nil {
panic(err)
}
defer file.Close()
// 解码图片为 image.Image
img, _, err := image.Decode(file)
if err != nil {
panic(err)
}
// 创建二进制位图
bmp, _ := gozxing.NewBinaryBitmapFromImage(img)
// 使用多种条码格式解码(CODE128, EAN-13, QR 等)
hints := map[gozxing.DecodeHintType]interface{}{
gozxing.DecodeHintType_TRY_HARDER: true,
}
reader := oned.NewMultiFormatUPCAReader()
result, err := reader.Decode(bmp, hints)
if err != nil {
fmt.Println("未识别到条码:", err)
return
}
fmt.Printf("类型: %s, 内容: %s\n", result.GetBarcodeFormat(), result.GetText())
}// 浏览器端使用 ZXing 库(通过 CDN 或 npm 引入)
// 示例:<script src="https://unpkg.com/@zxing/library@latest"></script>
async function decodeBarcode(imageFile) {
// 将 File 对象转为 HTMLImageElement
const img = await createImageBitmap(imageFile);
const codeReader = new ZXing.BrowserMultiFormatReader();
try {
const result = await codeReader.decodeFromImageBitmap(img);
console.log('条码类型:', result.format);
console.log('条码内容:', result.text);
return result;
} catch (err) {
console.error('解码失败:', err);
return null;
}
}
// 使用示例(假设页面有 <input type="file" id="fileInput">)
document.getElementById('fileInput').addEventListener('change', async (e) => {
const file = e.target.files[0];
if (file) {
const data = await decodeBarcode(file);
if (data) {
alert(`识别结果: ${data.text}`);
}
}
});8 个高频疑问
「条形码」下的其他工具