从图库ios 7中扫描条形码

时间:2014-04-28 14:19:14

标签: ios7 avfoundation barcode-scanner avcapturesession

我想扫描ios 7中照片库中的条形码或QR码图像。在ios 7中,我们可以使用相机扫描条形码图像,但我没有找到任何方法从中选择条形码图像UIImagePickerController并扫描它。 AVFoundation Framework中是否有可用的方法? 救救我..

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,由于支持arm64的架构要求,大多数曾经完美运行的32位条码SDK都被7.1打破了。 Zbar受到影响,ZXing完全退出iOS平台,剩下的就是商业套餐。我尝试过其中一个名为海牛的工作,但是它会从输出中截断条形码的第一个字符。目前,您最好的选择是使用IOS 7.1的这些商业SDK,或者回到7.0或6.1并使用Zbar。

@Stark提出的AV基础解决方案适用于相机捕捉(我已对其进行了一些修改以对其进行测试,以识别PDF417,AztecCodes和6个左右的1D条形码),但示例应用程序中的代码无法处理现有图像媒体库。我密集搜索,最接近的赌注是CoreImage检测,它对图像进行面部识别,遗憾的是还没有条形码检测选项。

答案 1 :(得分:-2)

有许多可用于条形码扫描的API: -

  • Softek条形码阅读器SDK
  • ZBar条形码阅读器
  • shopsavvy
  • 红色激光
  • 斑马线

如果您只想使用AVfoundation框架,这里是教程的链接.. http://www.appcoda.com/qr-code-ios-programming-tutorial/

这是开始阅读条形码的代码

 - (BOOL)startReading {
    NSError *error;

    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
    if (!input) {
        NSLog(@"%@", [error localizedDescription]);
        return NO;
    }

    _captureSession = [[AVCaptureSession alloc] init];
    [_captureSession addInput:input];

    AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
    [_captureSession addOutput:captureMetadataOutput];

    dispatch_queue_t dispatchQueue;
    dispatchQueue = dispatch_queue_create("myQueue", NULL);
    [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
    [captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];

    _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
    [_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
    [_videoPreviewLayer setFrame:_viewPreview.layer.bounds];
    [_viewPreview.layer addSublayer:_videoPreviewLayer];

    [_captureSession startRunning];

    return YES;
}

并阻止它。

-(void)stopReading{
    [_captureSession stopRunning];
    _captureSession = nil;

    [_videoPreviewLayer removeFromSuperlayer];
}