2017-05-04 451 views
3

我想从实时相机和图像中扫描qr和条形码。我以前使用ZBar库来扫描代码。它不扫描特定类型的qr和条形码。此外,苹果的AVFoundation框架在从实时相机扫描代码时看起来更加快速准确。使用CIDetector扫描条形码(1和2维)

所以我不想使用ZBar。为了扫描从图库中挑选的图像中的代码,我使用了CIDetector。但似乎CIDetector无法扫描图像中的条形码。我已经找遍了堆过流CIDetector For other Barcode TypesScanning barcode from UIImage natively (i.e., not using ZBar)

,但我还没有找到一种方法来扫描条形码形成图像使用CIDetector从画廊挑选。是否可以使用CIDetector从UIImages扫描条码?

不建议其他第三方库。我想用苹果的默认框架来完成这项工作。

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info 
{ 

    [picker dismissViewControllerAnimated:YES completion:nil]; 

    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage]; 
    CIImage *img = [[CIImage alloc]initWithImage:image]; 

    CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}]; 
    if (detector) 
    { 
     NSArray* featuresR = [detector featuresInImage:img]; 
     NSString* decodeR; 
     for (CIQRCodeFeature* featureR in featuresR) 
     { 
      NSLog(@"decode %@ ",featureR.messageString); 
      decodeR = featureR.messageString; 

      [self showAlertWithTitle:@"Success" withMessage:decodeR]; 
      return; 
     } 

    [self showAlertWithTitle:@"Error" withMessage:@"Invalid Image"]; 
    } 

} 
+0

您已经扫描了UIImages?将它们转换为CIImage([[CIImage alloc] initWithImage:image]),然后将它们传递给CIDetector。 – Lepidopteron

+0

这只适用于扫描QR码,但不适用于条形码。对于包含条形码的图像,我在调用'featuresInImage'时获得了空数组。 –

回答

0

直到现在,苹果的AVFoundation Framework还没有提供扫描图像库中条形码的方法。

因此,我通过使用AVFoundation Framework在实时相机中扫描QR和条形码来解决我的问题,而当用户从图片库中照片图片时,我使用ZBar Framework扫描qr和条形码。

0

使用ZXing 库。

ZXingObjC是ZXing(“Zebra Crossing”)的完整Objective-C端口,是一款Java条码图像处理库。它旨在用于iOS设备和Mac应用程序。

+0

我不想用任何第三方库进行扫描。 –

0

截至目前iOS的11 CIDetector只以下类型的图像来检测

  • CIDetectorTypeFace
  • CIDetectorTypeRectange
  • CIDetectorTypeQRCode
  • CIDetectorTypeText

所以按照您的要求,我们不能真正依靠CIDectector从图像读取条形码和QR码。但是,我们还有其他选项,如AVFoundation框架AVCaptureMetadataOutput,但我们需要有一个实时相机视图来检测条形码和QR码。

对于未来的读者,您可以查看Swift Camrea博客文章,以从自定义相机中检测元数据。


如果你的目标iOS11以上,我们确实有一组新的API Vision的从图像读取条形码。只需创建一个VNDetectBarcodesRequest并获取条形码结果。查看Github的iOS 11 QR Code Example项目。请注意,由于iOS 11仅处于测试阶段,所以视觉API的文档还不够成熟。