在线二维码解码器:扫描和识别二维码图片
什么是二维码解码
二维码解码是将 QR 图片还原为原始文本载荷的过程。与生成相反,解码要在像素里找到定位图案、估计模块网格并还原数据。在线 二维码解码器 在浏览器内完成这一步,图片不上传。
二维码结构
| 组成部分 | 功能 |
|---|---|
| 定位图案 (Finder Pattern) | 三角方形图案,定位与方向 |
| 对齐图案 (Alignment Pattern) | 辅助定位,提高准确性 |
| 时序图案 (Timing Pattern) | 黑白相间线,确定模块坐标 |
| 格式信息 (Format Information) | 纠错级别与掩码 |
| 数据区域 (Data Area) | 实际编码的数据 |
纠错级别(解码侧怎么理解)
| 级别 | 约可恢复面积 | 含义 |
|---|---|---|
| L | ~7% | 干净图、高密度数据 |
| M | ~15% | 一般用途 |
| Q | ~25% | 印刷/轻度污损 |
| H | ~30% | 易损环境、中心有意遮挡 |
纠错救的是数据模块的面积损伤,救不了「缺一个定位角」这类结构性丢失。
实现注记
本站 二维码解码器 使用 jsQR(^1.4.0):
| 项 | 本站行为 |
|---|---|
| 流程 | FileReader → Image → canvas.drawImage → getImageData → jsQR(data, width, height) |
| 库选项 | 不传 inversionAttempts 等选项(走 jsQR 默认) |
| 预处理 | 失败时依次尝试:原图 → 灰度 → 反相 → 灰度+反相;无去网纹 / 透视矫正 |
| 输入 | accept="image/*";支持选择文件、拖拽、剪贴板粘贴图片 |
| 输出 | 仅展示解码出的文本字符串与预览图;界面不展示 version / location 元数据 |
| 隐私 | 全程本地,不上传服务器 |
生成侧对照:二维码生成器(颜色 + PNG/SVG)、二维码设计器(样式与 Logo)。解码出的若是 URL,可用 URL 解析 / URL 参数解析 拆查询;若是 Base64 块,见 Base64 编码指南。
为什么需要二维码解码
- 信息获取:名片、海报、包装上的码
- URL 预览:先看清再决定是否打开(安全习惯)
- 数据提取:文本、Wi‑Fi 串、vCard
- 开发调试:核对自己生成的码是否字节级正确
- 无手机场景:桌面截图直接解
如何使用本站解码器
- 打开 二维码解码器
- 上传、拖拽或粘贴二维码图片(常见位图格式即可)
- 本地识别后显示文本与预览
- 一键复制结果
失败时优先:裁到只剩码面、换原图/截图(别拍屏幕)、保证三个定位角完整。
代码中的解码(与本站对齐)
JavaScript:jsQR(与本站相同调用形态)
import jsQR from 'jsqr';
function decodeQRCode(imageData) {
// Site tool: no options object — library defaults apply
const code = jsQR(imageData.data, imageData.width, imageData.height);
if (code) {
return {
data: code.data,
location: code.location,
version: code.version,
};
}
return null;
}
async function decodeQRFromFile(file) {
const img = new Image();
const url = URL.createObjectURL(file);
return new Promise((resolve) => {
img.onload = () => {
const canvas = document.createElement('canvas');
canvas.width = img.width;
canvas.height = img.height;
const ctx = canvas.getContext('2d');
ctx.drawImage(img, 0, 0);
const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
resolve(decodeQRCode(imageData));
URL.revokeObjectURL(url);
};
img.src = url;
});
}
本站 UI 展示 code.data。当非「原图像素」的预处理通道成功时,结果下方会提示具体变体(灰度 / 反色 / 灰度+反色)。反色码(浅模块深底)由预处理链路覆盖,无需单独开「强制反色」开关;自建集成若仍失败,可再试 jsQR 的 inversionAttempts: 'attemptBoth'。
Python:pyzbar(对照,非本站运行时)
from PIL import Image
from pyzbar.pyzbar import decode
def decode_qr_code(image_path):
img = Image.open(image_path)
results = decode(img)
for result in results:
print(f"类型: {result.type}")
print(f"数据: {result.data.decode('utf-8')}")
print(f"位置: {result.rect}")
return results
URL vs 文本:解码后怎么读
- 以
http:///https://开头 → 当链接处理;先肉眼检查域名与路径,再用 URL 工具拆参数。中文与%XX膨胀见 中文百分号编码。 WIFI:…→ Wi‑Fi 配置(含密码明文)——勿把截图丢进会上传的在线服务。BEGIN:VCARD→ 联系人卡片。- 其它 → 纯文本;不要假设「扫了就会打开网页」。
屏幕解码与损坏码
从屏幕再拍照会引入摩尔纹、子像素条纹、自动曝光与反光。纸能扫、屏不能扫时,优先截图文件再丢进解码器,而不是二次光学拍摄。
超大 Retina 截图也可能失败——模块相对画布过小;上传前紧裁三个定位角。过小图则相反:用最近邻放大(勿柔化),或从 二维码生成器 导出更大 PNG。
H 级号称约 30% 面积可恢复,但:
- 丢一个 finder → 多数库直接失败;
- 本站不做去网纹/透视矫正,糊图、强透视、半截码会失败;
- Logo 或污渍压在对齐图案上时,比「均匀脏一点」更致命。
实用顺序:换清晰原图 → 紧裁码面 → 平光直拍印刷品 → 仍失败再考虑专业取证级重建。若界面提示经「反色」预处理成功,说明原图是浅底深码的反色码;给默认「深色模块」的手机相机时,建议重新生成或打印深色模块版本。
隐私:本地解码保护什么
把支付码、门票、含密码的 WIFI: 串上传到解码服务,等于泄露场景与密钥材料。本站解码器在浏览器内处理。生成侧同理:动态码厂商的跳转日志会记扫描;本地静态码创建后无服务端痕迹。另注意照片 EXIF 定位——解码成功也可能已泄露拍摄位置,敏感场景应剥离元数据。
FAQ
二维码和条形码有什么区别?
二维码是二维条码,容量更大(数字最多约 7089、字母数字约 4296),并支持纠错。需要制作时用 二维码生成器。
二维码最多能存多少数据?
数字约 7,089、字母数字约 4,296、二进制约 2,953 字节、汉字约 1,817(均指规范上限、低纠错)。实际容量随版本与纠错级别下降。
为什么有些二维码扫描不了?
模糊、分辨率低、倾斜、反光、裁切定位角、或点阵过密。用高对比清晰图,裁切后重试。反色码:本站会自动尝试反色预处理——仍失败再离线提高对比度。仍不行可换手机相机光学扫描对照。
来自 ToolVault 工具匣 的开发手记。更多免费本地工具见 首页。
相关工具
相关文章
Markdown 转 Word 交付指南:样式映射与行内降级
把 Markdown 草稿变成可交付的 .docx:pandoc 命令行与浏览器本地转换两条路线,标题/表格/代码块的 Word 原生样式映射对照,行内格式降级清单,以及「可编辑」为什么比「看起来像」更重要。
Word 转 Markdown 怎么转才干净:两条路线与格式保真对照
docx 转 Markdown 教程:pandoc 命令行与浏览器本地转换两条路线对比,标题/表格/图片/自动编号的保真行为,.doc 旧格式、图片体积、合并单元格等常见坑的解法。
中国车牌号规则与校验:普通牌、新能源与特殊格式全解
中国大陆车牌号编码规则详解:普通蓝牌、新能源 GA36D-2018、武警与使馆牌的结构、省份简称与发牌机关编码,附在线校验方法。