1.打开相册
let vc = TZImagePickerController(maxImagesCount: 1, delegate: self)!
vc.allowTakeVideo = false
vc.allowPickingVideo = false
vc.allowPickingGif = false
vc.allowCameraLocation = false
vc.sortAscendingByModificationDate = false
self.present(vc, animated: true, completion: nil)
vc.didFinishPickingPhotosHandle = { photos,assets,isSelectOriginalPhoto in
if photos != nil {
if let image = photos!.first!.cgImage {
//拿到图片 去做识别处理
self.imageVisionRequest(image: image)
}
}
}
2.识别图片方法
//MARK: 图片识别
func imageVisionRequest(image:CGImage) {
let requestHandle = VNImageRequestHandler(cgImage: image, options: [:])
DispatchQueue.global().async {
do{
//self.barCodeDetectionRequest 是做了懒加载了
try requestHandle.perform([self.barCodeDetectionRequest])
}
catch let error as NSError {
print("Error in performing Image request: \(error)")
}
}
}
3.barCodeDetectionRequest 懒加载
lazy var barCodeDetectionRequest: VNDetectBarcodesRequest = {
let request = VNDetectBarcodesRequest { request, error in//识别结果回调
if error == nil {
if let observations = request.results {
print("图片识别结果",observations)
if observations.count > 0 {
if observations.first!.isKind(of: VNBarcodeObservation.self) {
let barcodeObservation = observations.first as! VNBarcodeObservation
//拿到结果 去处理下
self.visionResult(observation: barcodeObservation)
}
}
else {
//self.isScanBarCode 自定义的变量 判断是条形码还是二维码
let title = self.isScanBarCode ? "条形码" : "二维码"
SVProgressHUD.showError(withStatus: "请选择有效的\(title)")
}
}
else {
SVProgressHUD.showError(withStatus: "图片识别失败")
}
}
else {
SVProgressHUD.showError(withStatus: "图片识别失败")
}
}
return request
}()
func visionResult(observation:VNBarcodeObservation) {
print("barcodeDescriptor==",observation.barcodeDescriptor)
print("payloadStringValue==",observation.payloadStringValue)
print("observation.symbology=",observation.symbology)
if let resultString = observation.payloadStringValue {
if isScanBarCode {
if observation.symbology == .ean13 {//条形码
//拿到了String类型的结果 作相应的处理
}
else {
SVProgressHUD.showError(withStatus: "不是有效的条形码")
}
}
else {
if observation.symbology == .qr {//二维码
//拿到了String类型的结果 作相应的处理
}
else {
SVProgressHUD.showError(withStatus: "不是有效的二维码")
}
}
}
}