iOS开发之二维码扫描

来源:互联网 发布:撕开照片衣服的软件 编辑:程序博客网 时间:2024/05/18 17:27

二维码需要自带的库

AVFoundation/AVFoundation.h


创建对象

AVCaptureSession *session;

//开启摄像头

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {


        //获取摄像设备

        AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

 

        //创建输入流

        AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];


        //创建输出流

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


        //设置代理在主线程里刷新

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

        

        //初始化链接对象

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

        self.session = session;


        //高质量采集率

        [session setSessionPreset:AVCaptureSessionPresetHigh];

        

        [session addInput:input];

        [session addOutput:output];


        //设置扫码支持的编码格式(如下设置条形码和二维码兼容)

        output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];

        

        AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:session];

        layer.videoGravity=AVLayerVideoGravityResizeAspectFill;

        layer.frame=self.view.layer.bounds;

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

        //开始捕获

        [session startRunning];

    }

    

// 镂空方格  -> 创建图层

    // 参考http://segmentfault.com/a/1190000002436915


    CALayer *maskLayer = [CALayer layer];

    maskLayer.frame = self.view.frame;


    // 除镂空之外的地方,使用什么颜色填充

    maskLayer.backgroundColor = [UIColor yellowColor].CGColor;


    // 透明度为60%

    maskLayer.opacity = 0.6;

    [self.view.layer addSublayer:maskLayer];

    

//在图层中间抠出一块透明区域

    // 镂空范围为200x200

    CGFloat rectSize = 200;

    CAShapeLayer *shapeLayer = [CAShapeLayer layer];

    shapeLayer.frame = self.view.frame;

    [shapeLayer byRoundingCorners:UIRectCornerTopLeft|UIRectCornerBottomRight];

    // http://jamesonquave.com/blog/fun-with-cashapelayer/

    // 指明左上角和右下角为圆角,其他为方角 byRoundingCorners:UIRectCornerTopLeft | UIRectCornerBottomRight

    // 指明圆半径为20像素 cornerRadii:CGSizeMake(20, 20)

    // 镂空方格的frame bezierPathWithRoundedRect

    UIBezierPath *path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake((self.view.frame.size.width - rectSize) /2, (self.view.frame.size.height - rectSize) /2, rectSize, rectSize) byRoundingCorners:UIRectCornerAllCorners cornerRadii:CGSizeMake(40,40)];

    [path appendPath:[UIBezierPath bezierPathWithRect:self.view.layer.frame]];

    shapeLayer.path = path.CGPath;

    shapeLayer.fillRule = kCAFillRuleEvenOdd;

    

    maskLayer.mask = shapeLayer;

0 0