使用 iOS11 的 Vision Framework 时的条码字符串值
Barcode string value when using the Vision Framework of iOS11
以下 Swift 代码片段使用新的 iOS11 视觉框架来分析图像并在其中找到 QR 码。
let barcodeRequest = VNDetectBarcodesRequest(completionHandler {(request, error) in
for result in request.results! {
if let barcode = result as? VNBarcodeObservation {
if let desc = barcode.barcodeDescriptor as? CIQRCodeDescriptor {
let content = String(data: desc.errorCorrectedPayload, encoding: .isoLatin1)
print(content) //Prints garbage
}
}
}
}
let image = //some image with QR code...
let handler = VNImageRequestHandler(cgImage: image, options: [.properties : ""])
try handler.perform([barcodeRequest])
但是,问题是 desc.errorCorrectedPayload
returns 原始的 encoded data 是从 QR 码中读取的。
为了从描述符中获取可打印的内容字符串,必须解码此原始数据(例如,从前 4 位确定模式)。
它变得更加有趣,因为 Apple 已经在 AVFoundation 中拥有解码原始数据的代码。 AVMetadataMachineReadableCodeObject
class 已经有 .stringValue
字段,returns 已解码 字符串。
是否可以访问此解码代码并在 Vision 框架中也使用它?
现在您似乎可以使用 payloadStringValue 属性 of VNBarcodeObservation
在 iOS 11 beta 5 中引入的新 payloadStringValue 属性 从条形码中获取解码字符串。
if let payload = barcodeObservation.payloadStringValue {
print("payload is \(payload)")
}
以下 Swift 代码片段使用新的 iOS11 视觉框架来分析图像并在其中找到 QR 码。
let barcodeRequest = VNDetectBarcodesRequest(completionHandler {(request, error) in
for result in request.results! {
if let barcode = result as? VNBarcodeObservation {
if let desc = barcode.barcodeDescriptor as? CIQRCodeDescriptor {
let content = String(data: desc.errorCorrectedPayload, encoding: .isoLatin1)
print(content) //Prints garbage
}
}
}
}
let image = //some image with QR code...
let handler = VNImageRequestHandler(cgImage: image, options: [.properties : ""])
try handler.perform([barcodeRequest])
但是,问题是 desc.errorCorrectedPayload
returns 原始的 encoded data 是从 QR 码中读取的。
为了从描述符中获取可打印的内容字符串,必须解码此原始数据(例如,从前 4 位确定模式)。
它变得更加有趣,因为 Apple 已经在 AVFoundation 中拥有解码原始数据的代码。 AVMetadataMachineReadableCodeObject
class 已经有 .stringValue
字段,returns 已解码 字符串。
是否可以访问此解码代码并在 Vision 框架中也使用它?
现在您似乎可以使用 payloadStringValue 属性 of VNBarcodeObservation
在 iOS 11 beta 5 中引入的新 payloadStringValue 属性 从条形码中获取解码字符串。
if let payload = barcodeObservation.payloadStringValue {
print("payload is \(payload)")
}