2015-12-10 2 views
2

Я хочу, чтобы обнаружить QRCode от неподвижного изображения Вот кодНе обнаружения QR-код от статического изображения

let ciimage = <Load image from asset and covert to CIImage> 
let detector = CIDetector(ofType: CIDetectorTypeQRCode, context:nil, options:nil) 
let features = detector.featuresInImage(ciimage) 
print(features.count) 

Изображение правильно экземпляр CIImage который имеет QRCode, но я всегда получаю никаких особенностей, Есть какой-либо один была такая же проблема?

спасибо.

ответ

0

Я думаю, я нашел ответ

  • не

    Этот код работает только в Playground или реального iPhone, он никогда не работает на тренажере

  • Я создал QRCode изображения с помощью CIQRCodeGenerator Фильтр CoreImage.

Я надеюсь, что кто-то может проверить мой ответ здесь и дать мне совет.

Ниже исходный код, что я использовал

enum QRCodeUtilError:ErrorType{ 
    case GenerationFailed 
} 

extension UIImage { 
    /** 
    This function trys to return CIImage even the image is CGImageRef based. 
    - Returns: CIImage equal to current image 
    */ 
    func ciImage() -> CoreImage.CIImage?{ 
     // if CIImage is not nil then return it 
     if self.CIImage != nil { 
      return self.CIImage 
     } 

     guard let cgImage = self.CGImage else { 
      return nil 
     } 
     return CoreImage.CIImage(CGImage: cgImage) 
    } 
} 

/** 
QRCode utility class 
*/ 
class QRCodeUtil{ 
    /** 
    Generates 'H' mode qrcode image 
    - Parameter qrCode: QRCode String 
    - Returns: Optional UIImage instance of QRCode 
    */ 
    class func imageForQrCode(qrCode:String) throws -> UIImage{ 
     guard let filter = CIFilter(name: "CIQRCodeGenerator") else { 
      throw QRCodeUtilError.GenerationFailed 
     } 
     guard let data = qrCode.dataUsingEncoding(NSISOLatin1StringEncoding) else { 
      throw QRCodeUtilError.GenerationFailed 
     } 
     filter.setValue(data, forKey: "inputMessage") 
     filter.setValue("H", forKey: "inputCorrectionLevel") 

     guard let outputImage = filter.outputImage else { 
      throw QRCodeUtilError.GenerationFailed 
     } 

     /* 
    Convert the image to CGImage based because 
    it crashes when saving image using 
    UIImagePNGRepresentation or UIImageJPEGRepresentation 
    if image is CIImage based. 
    */ 
     let context = CIContext(options: nil) 
     let cgImage = context.createCGImage(outputImage, fromRect: outputImage.extent) 
     return UIImage(CGImage: cgImage) 
    } 

    /** 
    Detects QRCode from string 
    - Parameter qrImage: UIImage which has QRCode 
    - Returns: QRCode detected 
    */ 
    class func qrCodeFromImage(qrImage:UIImage) -> String { 
     let detector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy:CIDetectorAccuracyHigh]) 
     guard let ciImage = qrImage.ciImage() else { 
      return "" 
     } 
     guard let feature = detector.featuresInImage(ciImage).last as? CIQRCodeFeature else { 
      return "" 
     } 
     return feature.messageString 
    } 
} 
Смежные вопросы