为什么iOS核心图像QR码生成器无法正常工作?

时间:2015-04-27 08:06:25

标签: ios swift core-image

我正在尝试使用iOS Core Image API生成QR码:

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")
    }

}

但它既没有打印也没有#34;错误"也不会在imageView中显示qr代码。

1 个答案:

答案 0 :(得分:2)

以下是解决方案:

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;
}