为什么 iOS Core Image QR Code 生成器不工作?

Why iOS Core Image QR Code generator is not working?

我正在尝试使用 iOS Core Image API:

生成二维码
func createQRForString(#data : NSData)->CIImage!{
    var qrFilter = CIFilter(name: "CIQRCodeGenerator")
    qrFilter.setValue(data, forKey: "inputMessage")
    qrFilter.setValue("H", forKey:"inputCorrectionLevel")
    return qrFilter.outputImage
}



func createNonInterpolatedImageFromCIImage(image : CIImage,withScale scale:CGFloat)->UIImage{
    let cgImage = CIContext(options: nil).createCGImage(image, fromRect: image.extent())
    UIGraphicsBeginImageContext(CGSizeMake(image.extent().size.width*scale, image.extent().size.height*scale))
    let context = UIGraphicsGetCurrentContext()
    CGContextSetInterpolationQuality(context, kCGInterpolationNone)
    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return scaledImage
}

以及 viewDidLoad 方法中的以下代码:

let data = "Hello World".dataUsingEncoding(NSUTF8StringEncoding)

    if let image=createQRForString(data: data!){
            let uiimage = createNonInterpolatedImageFromCIImage(image, withScale: 1.0)
            imageView.image = uiimage
    }
    else{
        println("Error loading image")
    }

}

但它既不打印 "Error" 也不在 imageView 中显示二维码。

解决方法如下:

override func viewDidLoad() {
    super.viewDidLoad()
    self.imgView.image = generateCode()
}

func generateCode() -> UIImage {
    let filter = CIFilter(name: "CIQRCodeGenerator")

    let data = "Hello World".dataUsingEncoding(NSUTF8StringEncoding)
    filter.setValue("H", forKey:"inputCorrectionLevel")
    filter.setValue(data, forKey:"inputMessage")

    let outputImage = filter.outputImage
    let context = CIContext(options:nil)
    let cgImage = context.createCGImage(outputImage, fromRect:outputImage.extent())

    let image = UIImage(CGImage:cgImage, scale:1.0, orientation:UIImageOrientation.Up)
    let resized = resizeImage(image!, withQuality:kCGInterpolationNone, rate:5.0)
    return resized
}

func resizeImage(image: UIImage, withQuality quality: CGInterpolationQuality, rate: CGFloat) -> UIImage {
    let width = image.size.width * rate
    let height = image.size.height * rate

    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), true, 0)
    let context = UIGraphicsGetCurrentContext()
    CGContextSetInterpolationQuality(context, quality)
    image.drawInRect(CGRectMake(0, 0, width, height))

    let resized = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();        
    return resized;
}