条码扫描器使用指导
条码扫描器有两种用法:执行扫描打开摄像头对准码扫; 扫描图片直接识别一张图片(相册照片、聊天截图、素材、照相机拍的照片), 适合「别人发来一张二维码截图」「识别已保存的付款码 / 群二维码」这类摄像头扫不到的场景。 扫描图片不需要联网,也不需要额外的拓展或「文件增强」配合:图像选择器返回的路径直接传进去即可。
工作原理
- 扫描图片(图片)(
ScanImage)在后台识别,不卡界面; - 识别到码触发图片扫描完成(结果,格式列表)(
ImageScanned),一张图有几个码列表里就有几项,结果属性同时更新为第 1 项; - 图里没找到码触发未找到条码(图像位址)(
NoCodeFound),这不是错误; - 图片本身读不出来(路径写错、文件损坏)触发屏幕的「出现错误时」,错误码 701;
- 支持二维码、条形码(EAN、UPC、Code 128/39/93、ITF、Codabar)、PDF417、DataMatrix、Aztec,格式名统一为
QR_CODE、EAN_13这样的写法。
快速上手:从相册选图识别
放一个图像选择器(文字改为「从相册选二维码」)、一个标签和一个条码扫描器:
when 图像选择器1.AfterPicking() {
条码扫描器1.ScanImage(图像选择器1.Selection)
}
when 条码扫描器1.ImageScanned(结果, 格式列表) {
标签1.Text = join("识别到:", 条码扫描器1.Result)
}
when 条码扫描器1.NoCodeFound(图像位址) {
标签1.Text = "图片里没有找到二维码,换一张清晰些的试试"
}
选一张含二维码的截图,标签显示二维码里的内容;选一张普通照片,标签提示没找到。
案例一:一张图里有多个码
快递面单、商品包装上常常同时有二维码和条形码,结果列表会全部列出:
when 条码扫描器1.ImageScanned(结果, 格式列表) {
列表显示框1.Elements = []
for i = 1 to length(结果) {
列表显示框1.Elements = append(列表显示框1.Elements, [join(格式列表[i], ":", 结果[i])])
}
}
案例二:摄像头扫码与图片识别共用一套处理
摄像头扫到的结果和图片识别的第 1 项走同一个过程,界面只写一遍:
procedure 处理结果(内容) {
标签_结果.Text = 内容
if contains(内容, "http") {
Web浏览器1.GoToUrl(内容)
}
}
when 按钮_扫码.Click() {
条码扫描器1.DoScan()
}
when 条码扫描器1.AfterScan(返回结果) {
处理结果(返回结果)
}
when 条码扫描器1.ImageScanned(结果, 格式列表) {
处理结果(结果[1])
}
常见问题
| 现象 | 原因与处理 |
|---|---|
| 一直触发「未找到条码」 | 码在照片里太小、太模糊、拍歪或反光;截图和生成的码一般都能识别,照片可以先裁剪到码附近再识别 |
| 触发屏幕「出现错误时」,错误码 701 | 图片路径不对或文件已被删除;图像选择器的选中项、照相机返回的路径都可以直接用 |
| 安卓 13 以上弹出权限请求 | 识别手机存储里的图片需要读图片权限,同意后自动继续识别;拒绝触发「权限被拒绝」 |
| 深色底浅色码识别不出 | 已自动反色重试;仍不行时多半是对比度太低 |
| 和 ML Kit 条码识别有什么区别 | 扫描图片用平台自带的识别能力,不增加安装包体积;需要实时摄像头取景框、定位框等高级功能再用机器学习分类的条码识别组件 |
平台说明
安卓、iOS、鸿蒙都支持扫描图片:安卓用自带的 ZXing(与摄像头扫码同源),iOS 用系统 Vision,鸿蒙用系统扫码服务。 三个平台返回的格式名一致,个别模糊图片的识别结果可能因引擎不同而有差异。
扫码添加客服咨询