Ios 从相机和swift图像库中提取的图像中扫描QR码和条形码

Ios 从相机和swift图像库中提取的图像中扫描QR码和条形码,ios,swift,zbar-sdk,Ios,Swift,Zbar Sdk,我是Ios的新手。我正在学习斯威夫特和被忽视的对象c 目前,我正在用swift和xcode 6.1编写一个演示,它可以扫描相机中的qrcode和条形码,也可以扫描图像库中的图像 我知道AVFoundation framework支持扫描qrcode和条形码,但它只能从摄像头进行扫描 我搜索并找到了ZBARDK,它支持摄像头和图像的扫描代码。我按照和中的说明操作(将代码转换为swift)。然而,当我运行应用程序时,在从库中选择图像后,会发生错误 这是我的密码 import UIKit im

我是Ios的新手。我正在学习斯威夫特和被忽视的对象c

目前,我正在用swift和xcode 6.1编写一个演示,它可以扫描相机中的qrcode和条形码,也可以扫描图像库中的图像

我知道AVFoundation framework支持扫描qrcode和条形码,但它只能从摄像头进行扫描

我搜索并找到了ZBARDK,它支持摄像头和图像的扫描代码。我按照和中的说明操作(将代码转换为swift)。然而,当我运行应用程序时,在从库中选择图像后,会发生错误

这是我的密码

import UIKit
    import AVFoundation

    extension ZBarSymbolSet: SequenceType {
        public func generate() -> NSFastGenerator {
            return NSFastGenerator(self)
        }
    }

    class FirstViewController: UIViewController, ZBarReaderDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate {

        let reader = ZBarReaderController()

        @IBOutlet weak var lblResult: UILabel!
        @IBOutlet weak var imgView: UIImageView!

        override func viewDidLoad() {
            super.viewDidLoad()
            reader.delegate = self
        }

        override func didReceiveMemoryWarning() {
            super.didReceiveMemoryWarning()
            // Dispose of any resources that can be recreated.
        }

        @IBAction func scanCode(sender: AnyObject) {
            let scanner = reader.scanner
            scanner.setSymbology(ZBAR_I25, config: ZBAR_CFG_ENABLE, to: 0)
            reader.modalPresentationStyle = .Popover
            presentViewController(reader, animated: true, completion: nil)
        }

        func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]) {
            var results: NSFastEnumeration = info["ZBarReaderControllerResults"] as NSFastEnumeration

            var symbolFound : ZBarSymbol?

            // =============== Error here ==================
            for symbol in results as ZBarSymbolSet {
                symbolFound = symbol as? ZBarSymbol
                break
            }
            var resultString = NSString(string: symbolFound!.data)
            println(resultString)

        }

    }
这是错误图像

如果有人告诉我发生错误的原因和修复方法,或者有任何方法使用AVFoundation或其他库(包含详细文档和示例)扫描图像代码,我将非常感激(请给出详细说明,因为我刚刚学习了swift和ios 3周)。
谢谢。

我还想从没有Zbar的图像中读取二维码

您可以改用
CIDetector
。我找到了解决办法。 在我的例子中,我从库中取出一张照片(应该是二维码,这里是
qrcodeImg
),然后在
CIImage
中将其转换为
CIDetector
解码

qrCodeImageView.image=qrcodeImg

let detector:CIDetector=CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh])
let ciImage:CIImage=CIImage(image:qrcodeImg)
var qrCodeLink=""

let features=detector.featuresInImage(ciImage)
for feature in features as! [CIQRCodeFeature] {
   qrCodeLink += feature.messageString
}

if qrCodeLink=="" {
    print("nothing")
}else{
    print("message: \(qrCodeLink)")
}

对于
Swift3
您可以使用以下代码从
ZBarSDK

extension ZBarSymbolSet: Sequence {
    public func makeIterator() -> NSFastEnumerationIterator {
        return NSFastEnumerationIterator(self)
    }
}

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    // ADD: get the decode results
    let results: NSFastEnumeration = info[ZBarReaderControllerResults] as! NSFastEnumeration

    var symbolFound : ZBarSymbol?

    for symbol in results as! ZBarSymbolSet {
        symbolFound = symbol as? ZBarSymbol
        break
    }
    let resultString = symbolFound!.data
    print(resultString)
}

发生了什么错误?具体点。如果可能,请显示错误消息或堆栈跟踪。您好,Marie Dm,谢谢您的回答。然而我找到了另一个图书馆。我把它贴在这里了,嗨@SonTran,我已经看到了这个库,但似乎你需要导入一个SDK,而我不想这样。这就是我选择这个解决方案的原因。无论如何,谢谢你;)@UmeshSharma我想是的,但我只尝试过qr码。@UmeshSharma它与使用的CiDetector类型相同(请参阅检测器类型下拉:):“CiDetector类型QRCode:一种检测器,用于在静态图像或视频中搜索快速响应码(一种2D条形码),返回CIQRCodeFeature对象,提供有关检测到的条形码的信息。”@你真的用这个代码检测条形码了吗?