• iOS 系统二维码扫描(可限制扫描区域)


       使用 AVFoundation系统库来进行二维码扫描并且限制扫描二维码的范围。(因为默认的是全屏扫描)

       

    -(void)beginCode

    {

        //1.摄像头设备

        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

        

        /*

         // Media types

         

         AVMediaTypeVideo

         AVMediaTypeAudio

         AVMediaTypeText

         AVMediaTypeClosedCaption

         AVMediaTypeSubtitle

         AVMediaTypeTimecode

         AVMediaTypeMetadata

         AVMediaTypeMuxed

         */

        

        //2.设置输入

        /**

         *  设置输入  此方法需要判断 因为模拟器没有摄像头

         *

         *  @param  把摄像头作为输入的设备

         *

         *  @return 返回AVCaptureInput

         */

        NSError *error = nil;

        AVCaptureInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];

        if (error) {

            NSLog(@"没有摄像头%@",error);

            return;

        }

        //3.设置输出(Metdata元数据)

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

        //3.1输出的代理 捕获二维码的图像

        //dispatch_get_main_queue()使用主线程队列,响应比较同步,使用其他队列响应不同步。

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

        //3.2 设置扫描区域  默认是全屏扫描

    //这个CGRectMake(Y,X,H,W) 1代表最大值    原点是左上角 为起始点

    //    [output setRectOfInterest:CGRectMake(0, 0.5, 0.5, 0.5)];//左上角 1/4 屏幕

    //    [output setRectOfInterest:CGRectMake(0.5, 0.5, 0.5, 0.5)];//左下角 1/4 屏幕

    //    [output setRectOfInterest:CGRectMake(0.5, 0, 0.5, 0.5)]; //右下角 1/4 屏幕

    //    [output setRectOfInterest:CGRectMake(0, 0, 0.5, 0.5)]; //右上角 1/4 屏幕

    //     [output setRectOfInterest:CGRectMake((124)/ScreenHigh,          ((ScreenWidth220)/2)/ScreenWidth,220/ScreenHigh,220/ScreenWidth)]; //设置自定义像素点的 位置

        [output setRectOfInterest:CGRectMake(0.25,0.25, 0.5, 0.5)]; //貌似 中间的感觉!!!

        //4.拍摄会话

        AVCaptureSession *session = [[AVCaptureSession alloc] init];

        _session = session;

        //添加session的输入和输出

        [session addInput:input];

        [session addOutput:output];

        

        //4.1设置输出的格式

        [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

        

        //5.设置预览图层 (让用户看到扫描结果)

        AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:session];

        _previewLayer = preview;

        //5.1设置preview的属性

        preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

        //5.2设置preview的图层的大小

        [preview setFrame:self.view.bounds];

        //5.3将图层添加到视图的图层

        [self.view.layer insertSublayer:preview atIndex:0];

        

        //6.启动会话

        [session startRunning];

    }

    #pragma mark 输出的代理方法

    //此方法是在识别到QRCode,并且完成转换

    //如果QRCode的内容越大,转换需要的时间就越长

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

    {

        //会频繁的扫描

        //如果扫描完成就停止

        [_session stopRunning];

        //删除预览的图层

        [_previewLayer removeFromSuperlayer];

        

        //设置界面显示扫描结果

        NSString *reslutStr = [[NSString alloc] init];

        if (metadataObjects.count > 0) {

            AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];

            reslutStr = [obj stringValue];//这个就是 扫描的结果

            //如果需要对URL 名片 等信息进行扫描 再次进行扩展

        }

        NSLog(@"%@",metadataObjects);

    }

    //关于设置扫描区域的解释

     @abstract  摘要

    Specifies a rectangle of interest for limiting the search area for visual metadata.

       指定一个矩形限制搜索区域的视觉感兴趣的元数据。

     

     @discussion 讨论

    The value of this property is a CGRect that determines the receiver's rectangle of interest for each frame of video.  

         这个属性的值是CGRect中决定了接收机的矩形感兴趣的视频的每一帧

        

    The rectangle's origin is top left and is relative to the coordinate space of the device providing the metadata.  Specifying 

    a rectOfInterest may improve detection performance for certain types of metadata. The default value of this property is the 

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

    矩形的起源是左上角相对于设备的坐标空间提供元数据。指定rectOfInterest可能改善检测性能对于某些类型的元数据。此属性的默认值价值CGRectMake(0,0,1,1)。元数据对象的边界不相交的rectOfInterest恕不退还

    //CGRectMake(Y,X,H,W)  这个 坐标顺序很重要

  • 相关阅读:
    创建 SSH Keys
    idea创建管理项目
    springboot拦截器之验证登录
    SpringBoot防XSS攻击
    String,StringBuffer与StringBuilder的区别|线程安全与线程不安全
    算法的时间复杂度和空间复杂度详解
    switch语句以及三种循环语句的总结
    kafka原理简介并且与RabbitMQ的选择
    Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和区别
    RabbitMQ和kafka从几个角度简单的对比
  • 原文地址:https://www.cnblogs.com/zhaozhongpeng/p/4878958.html
Copyright © 2020-2023  润新知