iOS之Scanning的实现

Posted 象棋中的象棋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了iOS之Scanning的实现相关的知识,希望对你有一定的参考价值。

//写在最前

/*

 AVFoundation原生框架的好处就是扫描特别快效率特别高,但是可能会遇到一个问题就是不知道怎么去限制扫描范围。

 二维码扫描有关优秀第三方库:---- ZXing google推出的开源项目-----ZBar SDK 里面也有详细的文档

 */

引入头文件导入流媒体需要的框架

@import AVFoundation;

//遵守协议 AVCaptureMetadataOutputObjectsDelegate

@property (nonatomic,strong)AVCaptureSession *session;

@property (nonatomic,strong)AVCaptureVideoPreviewLayer *layer;

- (void)viewDidLoad {

    [super viewDidLoad];

    [self startRunningSession];

}

- (void)startRunningSession

// 获取 AVCaptureDevice 实例

    NSError * error;

    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

     [captureDevice setTorchMode:AVCaptureTorchModeOn];   //开启照明

    // 初始化输入流

    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];

    if (!input) {

        NSLog(@"%@", [error localizedDescription]);

    }

    // 创建会话

    _session = [[AVCaptureSession alloc] init];

    if ([_session canAddInput:input]) {

        // 添加输入流

        [_session addInput:input];

    }

   

    // 初始化输出流

    AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];

    if ([_session canAddOutput:captureMetadataOutput]) {

        // 添加输出流

        [_session addOutput:captureMetadataOutput];

    }

    [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

    // 设置元数据类型 AVMetadataObjectTypeQRCode

    [captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

    

    //value CGRectMake(0, 0, 1, 1). Metadata objects whose bounds do not intersect with the rectOfInterest will not be returned.

   // [captureMetadataOutput setRectOfInterest:CGRectMake(124/667.0,100/375.0,160/667.0, 160/375.0)];

    

    // 创建输出对象

    _layer = [AVCaptureVideoPreviewLayer layerWithSession:_session];

    [_layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

    [_layer setFrame:CGRectMake(50, 100, 280, 280)];

    [self.view.layer addSublayer:_layer];

    // 开始会话

    [_session startRunning];

}

 

#pragma  -   mark   -     AVCaptureMetadataOutputObjectsDelegate

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{

    NSLog(@"-------");

    if (metadataObjects && metadataObjects.count) {

        AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];

        NSString *result;

        if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {

            result = metadataObj.stringValue;

            NSLog(@"result:%@",result);

        } else {

            NSLog(@"不是二维码");

        }

     [_session stopRunning];

      _session = nil; 

 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"QRCodeInfo"

                                                    message:result

                                                   delegate:nil

                                          cancelButtonTitle:@"cancel"

                                          otherButtonTitles: nil];

    [alert show];

    }

}

 

//写在最后

很小的二维码,边长不到1cm,于是就修改了 sessionPreset 为 1080p 的,当时用的是ZXing, 当把图片质量改清楚时,也造成了性能的下降,基本打开扫描界面就会报memoryWarning,但是也确实解决了小二维码扫描的问题。

AVCaptureSession 可以设置 sessionPreset 属性,这个决定了视频输入每一帧图像质量的大小。

  • AVCaptureSessionPreset320x240
  • AVCaptureSessionPreset352x288
  • AVCaptureSessionPreset640x480
  • AVCaptureSessionPreset960x540
  • AVCaptureSessionPreset1280x720
  • AVCaptureSessionPreset1920x1080

以上列举了部分的属性值,分别代表输入图片质量大小,一般来说AVCaptureSessionPreset640x480就够使用,但是如果要保证较小的二维码图片能快速扫描,最好设置高些,如AVCaptureSessionPreset1920x1080(就是我们常说的1080p).

提升扫描速度和性能的就是设置解析的范围,在zbar和zxing中就是scanCropAVFoundation中设置 AVCaptureMetadataOutput 的 rectOfInterest 属性来配置解析范围。

captureOutput.rectOfInterest = CGRectMake(cropRect.origin.y/size.height,
                                         cropRect.origin.x/size.width,
                                         cropRect.size.height/size.height,
                                         cropRect.size.width/size.width);
rectOfInterest是基于图像的大小裁剪的。

》》》此博文源于各路汇总。

以上是关于iOS之Scanning的实现的主要内容,如果未能解决你的问题,请参考以下文章

iOS BLE Scanning with (user) kill App

php OPcache

ios开发之手电使用补充

iOS-ARKit扫描和检测3D对象-Scanning and Detecting 3D Objects

iOS-ARKit扫描和检测3D对象-Scanning and Detecting 3D Objects

IOS开发-OC学习-常用功能代码片段整理