使用 CIDetector 扫描条码(一维和二维)

Using CIDetector to scan bar Codes (1 and 2 dimentional)

我想从实时摄像头和图像中扫描二维码和条形码。我以前使用 ZBar 库来扫描代码。它不扫描特定类型的二维码和条形码。此外,Apple 的 AVFoundation 框架在从实时摄像头扫描代码时似乎更加快速和准确。

所以我不想用ZBar。为了扫描从图库中选取的图像的代码,我使用了 CIDetector。但似乎 CIDetector 无法从图像中扫描条形码。我已经搜索了整个堆栈 CIDetector For other Barcode Types

但我还没有找到一种方法来使用 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"];
     }

}

使用ZXing 图书馆。

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

目前苹果的 AVFoundation Framework 还没有提供扫描从图像库中挑选的条形码的方法。

所以我通过使用 AVFoundation 框架在实时相机中扫描二维码和条形码解决了我的问题,而当用户从图库中拍摄照片时,我使用 ZBar 框架扫描二维码和条形码。

截至目前 iOS 11 CIDetector 只有以下类型可从图像中检测

  • CIDetectorTypeFace
  • CIDetectorTypeRectange
  • CIDetectorTypeQRCode
  • CIDetectorTypeText

因此,根据您的要求,我们不能真正依赖 CIDectector 从图像中读取条形码和 QR 码。然而,我们确实有其他选择,比如 AVFoundation 框架 AVCaptureMetadataOutput 但我们需要有一个实时摄像头视图来检测条形码和二维码。

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


如果您的目标是 iOS11 岁及以上,我们确实有来自 Github 的一组新的 Vision API's to read barcodes from an image. Simply create a VNDetectBarcodesRequest and get the barcode results. Check out iOS 11 QR Code Example 项目。请注意,视觉 API 的文档还不够成熟,因为 iOS 11 仅处于测试阶段。