How to read QR code from static image

Tom Shen picture Tom Shen · Mar 12, 2016 · Viewed 16.2k times · Source

I know that you can use AVFoundation to scan a QR code using the device's camera. Now here comes the problem, how can I do this from an static UIImage object?

Answer

Sahil Manchanda picture Sahil Manchanda · Mar 14, 2018

Swift 4 version of @Neimsz's answer

func detectQRCode(_ image: UIImage?) -> [CIFeature]? {
    if let image = image, let ciImage = CIImage.init(image: image){
        var options: [String: Any]
        let context = CIContext()
        options = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
        let qrDetector = CIDetector(ofType: CIDetectorTypeQRCode, context: context, options: options)
        if ciImage.properties.keys.contains((kCGImagePropertyOrientation as String)){
            options = [CIDetectorImageOrientation: ciImage.properties[(kCGImagePropertyOrientation as String)] ?? 1]
        } else {
            options = [CIDetectorImageOrientation: 1]
        }
        let features = qrDetector?.features(in: ciImage, options: options)
        return features

    }
    return nil
}

How to use

if let features = detectQRCode(#imageLiteral(resourceName: "qrcode")), !features.isEmpty{
    for case let row as CIQRCodeFeature in features{
        print(row.messageString ?? "nope")
    }
}

And during the execution this doesn't produce the Finalizing CVPixelBuffer 0x170133e20 while lock count is 1

I used the following QRCode Image (QRCode = https://jingged.com)

(Tested on iPhone 6 simulator with iOS version 11.2)

enter image description here

Output:

2018-03-14 15:31:13.159400+0530 TestProject[25889:233062] [MC] Lazy loading NSBundle MobileCoreServices.framework
2018-03-14 15:31:13.160302+0530 TestProject[25889:233062] [MC] Loaded MobileCoreServices.framework
https://jingged.com