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

时间:2022-10-31 20:46:31

使用 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)  这个 坐标顺序很重要