iOS应用生成的Code128条码无法被AVCaptureSession扫描识别原因求解
问题原因
- 核心原因:扫描配置的支持码型未包含你生成的条码类型
你生成条码使用CICode128BarcodeGenerator生成的是Code128类型一维码,但在扫描会话的配置代码中,output.metadataObjectTypes仅配置了.qr(二维码)、.ean8、.ean13三种码型,系统扫描器不会识别不在支持列表内的Code128码,因此不会触发代理回调。你扫描谷歌搜到的条码可正常识别,是因为你搜到的条码属于已配置的EAN-13类型,在支持范围内。 - 次要潜在问题:生成的条码未预留安静区
Code128码的规范要求条码左右两侧需预留至少10个模块宽度的空白区域(安静区),你当前生成逻辑直接放大滤镜输出的图像使用,条码边缘无空白,可能导致部分扫描器无法识别条码起止位置。
解决方案
- 新增Code128码型到扫描支持列表
修改setupSession方法中的码型配置行,添加.code128枚举值:
// 修改前 output.metadataObjectTypes = [.qr, .ean8, .ean13] // 修改后 output.metadataObjectTypes = [.qr, .ean8, .ean13, .code128]
- 可选:优化条码生成逻辑,添加安静区
生成条码时在四周预留空白区域,示例逻辑如下:
extension UIImage convenience init?(text: String?, codeType: CodeType) { let isQRCode = codeType.isQrcode let data = text?.data(using: isQRCode ? .utf8 : .ascii) let filter = CIFilter(name: isQRCode ? "CIQRCodeGenerator" : "CICode128BarcodeGenerator") filter?.setValue(data, forKey: "inputMessage") if isQRCode { filter?.setValue("Q", forKey: "inputCorrectionLevel") } guard let ciimage = filter?.outputImage else { return nil } // 放大条码 let scaledImage = ciimage.transformed(by: CGAffineTransform(scaleX: 12, y: 12)) // 非二维码添加20px的四周安静区 if !isQRCode { let renderer = UIGraphicsImageRenderer(size: CGSize(width: scaledImage.extent.width + 40, height: scaledImage.extent.height + 40)) let paddedImage = renderer.image { context in UIColor.white.setFill() context.fill(CGRect(origin: .zero, size: renderer.format.bounds.size)) UIImage(ciImage: scaledImage).draw(at: CGPoint(x: 20, y: 20)) } self.init(cgImage: paddedImage.cgImage!) return } self.init(ciImage: scaledImage) }
完成上述修改后即可正常识别应用生成的Code128条码。
内容的提问来源于stack exchange,提问作者kunass2
相关产品推荐
相关产品推荐

