条码扫描器使用指导

← 返回条码扫描器组件参考 · 全部使用指导

条码扫描器使用指导

条码扫描器有两种用法:执行扫描打开摄像头对准码扫; 扫描图片直接识别一张图片(相册照片、聊天截图、素材、照相机拍的照片), 适合「别人发来一张二维码截图」「识别已保存的付款码 / 群二维码」这类摄像头扫不到的场景。 扫描图片不需要联网,也不需要额外的拓展或「文件增强」配合:图像选择器返回的路径直接传进去即可。

工作原理

  • 扫描图片(图片)(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,鸿蒙用系统扫码服务。 三个平台返回的格式名一致,个别模糊图片的识别结果可能因引擎不同而有差异。

文档反馈