2015-04-27 2 views
1

Я пытаюсь создать QR-код с помощью IOS API ядра Image:Почему генератор кода QR-кода iOS не работает?

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" и не показывает код Qr в ImageView.

+0

Try отслеживать на какой именно шаг вы получите первый 'nil' значение – Azat

+0

@Azat Я подумал, что если createQRForString возвращает значение не-ноль, чем все остальные не могут опциями быть нулевым , –

+0

Попробуйте вызвать 'UIGraphicsBeginImageContext' с некоторым статическим' size', пожалуйста, – Azat

ответ

1

Вот решение:

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

Это работает, отлично! В чем была проблема? –

+0

У вас нет кода, который на самом деле рисует его, например 'image.drawInRect (CGRectMake (0, 0, width, height))' – Azat

Смежные вопросы