2015-02-09 97 views
2

我是一个Ios新手。我在学习迅速和忽视的对象c。ZXingObjc - 将对象c转换为swift

目前,我正在用swift和xcode 6.1编写演示程序,它可以从相机或图像库中扫描qrcode和条形码。

之前,我尝试使用zbar SDK来做到这一点,但它发生错误,我不知道如何解决它,我发布这个错误在后:Scan qrcode and barcode from camera and image which picked from image library in swift,但没有人回答。

我正在尝试使用ZXingObjC从图像和相机扫描qrcode和条形码https://github.com/TheLevelUp/ZXingObjC,我读到它的用法并试图转换为swift。但它发生错误,我不知道如何解决它。

这里是我的代码:

import UIKit 

class ViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate { 

    @IBOutlet weak var lblResult: UILabel! 
    @IBOutlet weak var imgView: UIImageView! 
    var imagePicker = UIImagePickerController() 

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

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

    @IBAction func scanCode(sender: AnyObject) { 
     imagePicker.sourceType = .PhotoLibrary 
     imagePicker.allowsEditing = false 
     presentViewController(imagePicker, animated: true, completion: nil) 
    } 

    func imagePickerController(picker: UIImagePickerController!, didFinishPickingMediaWithInfo info: NSDictionary!) { 
     var tempImage:UIImage = info[UIImagePickerControllerOriginalImage] as UIImage 
     imgView.contentMode = .ScaleAspectFit 
     imgView.image = tempImage 
     dismissViewControllerAnimated(true, completion: nil) 

     //====> object c code <===== 
     /* 
     ZXLuminanceSource *source = [[[ZXCGImageLuminanceSource alloc] initWithCGImage:imageToDecode] autorelease]; 
     ZXBinaryBitmap *bitmap = [ZXBinaryBitmap binaryBitmapWithBinarizer:[ZXHybridBinarizer binarizerWithSource:source]]; 

     NSError *error = nil; 
     ZXDecodeHints *hints = [ZXDecodeHints hints]; 
     ZXMultiFormatReader *reader = [ZXMultiFormatReader reader]; 
     ZXResult *result = [reader decode:bitmap 
      hints:hints 
      error:&error]; 
     if (result) { 
     } 
     */ 

     //====> Convert to swift and happen error <===== 
     let source: ZXLuminanceSource = ZXCGImageLuminanceSource(initWithCGImage: tempImage) 
     let binazer: ZXHybridBinarizer = ZXHybridBinarizer(source: source) 
     let bitmap: ZXBinaryBitmap = ZXBinaryBitmap(binarizer: binazer) 

     var error: NSError? 

     var hints: ZXDecodeHints = ZXDecodeHints() 
     var reader: ZXMultiFormatReader = ZXMultiFormatReader() 
     var result: ZXResult = reader(bitmap, hints:hints, error: error) 
     if (result) { 
      lblResult.text = result.text; 
     } 
    } 

} 

我会很感激,如果有人让我知道它为什么会发生错误,以及如何解决它(请提供详细的说明,因为我刚刚得知迅速和3 IOS几周没有学习对象c)。谢谢。

被修改: 此代码适用于我。

let source: ZXLuminanceSource = ZXCGImageLuminanceSource(CGImage: tempImage.CGImage) 
let binazer = ZXHybridBinarizer(source: source) 
let bitmap = ZXBinaryBitmap(binarizer: binazer) 
var error: NSError? 
let hints: ZXDecodeHints = ZXDecodeHints.hints() as ZXDecodeHints 
var reader = ZXMultiFormatReader() 

if let result = reader.decode(bitmap, hints: hints, error: &error) { 
    lblResult.text = result.text; 
} 
+0

儿子,你可以分享工作项目,我无法解决ZXLuminanceSource的依赖关系。 – harsha 2015-09-12 13:01:19

+0

我们可以使用AVFoundation框架实现从库中扫描QR吗? – 2017-08-14 13:48:25

回答

5

你几乎在那里 - 这应该让你休息。注意意见:

// initializers are imported without "initWith" 
let source: ZXLuminanceSource = ZXCGImageLuminanceSource(CGImage: tempImage) 
let binazer = ZXHybridBinarizer(source: source) 
let bitmap = ZXBinaryBitmap(binarizer: binazer) 

var error: NSError? 

var hints = ZXDecodeHints() 
var reader = ZXMultiFormatReader() 
// 1) you missed the name of the method, "decode", and 
// 2) use optional binding to make sure you get a value 
if let result = reader.decode(bitmap, hints:hints, error: error) { 
    lblResult.text = result.text; 
}