用Swift从相机和图像库中扫描二维码和条形码

4
我是一个Ios的新手。我正在学习Swift,忽略了Objective-C。
目前,我正在使用Swift和Xcode 6.1编写演示文稿,可以从相机扫描二维码和条形码,或从图像库中选择图像。
我知道AVFoundation框架支持扫描二维码和条形码,但它只能从相机扫描。
我搜索并找到了zbarSDK,它支持从相机和图像扫描代码。我按照http://zbar.sourceforge.net/iphone/sdkdoc/NSFastEnumeration in Swift(将代码转换为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扫描图像代码,或者是否有其他库(具有详细的文档和示例)来完成此操作(请提供详细说明,因为我只学习了3周的Swift和iOS)。 谢谢。


发生了什么错误?请具体说明。如果可能的话,请显示错误消息或堆栈跟踪。 - Lorenz Meyer
2个回答

15

我也想从图像中读取QR码,而且不用Zbar。

你可以使用CIDetector。我在这里找到了解决方案(链接)。 在我的情况下,我从库中选择一张照片(假设是QR码,这里用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)")
}

嗨,Marie Dm,谢谢你的回答。 不过我找到了另一个库。我在这里发布了它:https://dev59.com/Uofca4cB1Zd3GeqPl63t - Son Tran
2
嗨@SonTran,我已经看到了这个库,但似乎需要导入一个SDK,而我不想要那个。这就是为什么我选择了这个解决方案。无论如何,还是谢谢;) - Marie Dm
@UmeshSharma 使用相同的CIDectetor类型(请参见以下检测器类型: https://developer.apple.com/library/ios/documentation/CoreImage/Reference/CIDetector_Ref/#//apple_ref/doc/constant_group/Detector_Types):“CIDetectorTypeQRCode:一种探测器,可在静止图像或视频中搜索快速响应码(一种2D条形码),返回CIQRCodeFeature对象,提供有关检测到的条形码的信息。” - Marie Dm
仅适用于二维条形码。我想要处理一维条形码。 - Umesh Sharma
无论如何,我只是在进行一些研发。如果我必须开发这个应用程序,可能我会制作一个包含所有功能的组件(如果还没有)。顺便感谢你的回复。 - Saad
显示剩余5条评论

0

对于 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)
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接