我们被问到一个iOS应用,该应用可以检测条形码(可能的类型为code128,code93,code39),并且在检测到之后,我们需要重新创建图像并在主视图中显示条形码。
为了检测条形码,我们使用AVCaptureSession
框架,使用CoreImage
生成图像。
我能够检测到条形码的字符串值,但是当我尝试获取CIBarcodeDescriptor
字段时却显示为nil,因此无法在CoreImage部分中传递此信息。
这是我的代码
检测条形码委托人
public func scannerDelegate(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject],from connection: AVCaptureConnection){
if let metadataObject = metadataObjects.first{
guard let readableObject = metadataObject as? AVMetadataMachineReadableCodeObject else{
return
}
//barcode String id
guard let barcodeStringValue = readableObject.stringValue else{
return
}
//readableObject.descriptor
guard let descriptor = readableObject.descriptor else{
return
}
//Pass parameters to the caller and stop Capture Session
}
}
生成条形码图像
let filterName = descriptor.rawValue
guard let data = barcodeStringValue.data(using: .ascii),
let filter = CIFilter(name: filterName) else {
return nil
}
filter.setValue(data, forKey: "inputMessage")
guard let image = filter.outputImage else {
return nil
}
因此,我无法在CIFilter
类中传递filterName参数,我针对QRCode测试了此解决方案,并且效果很好,我是否可以通过条形码获得相同的结果?还是应该使用外部库来完成这项工作?