[iOS 原生代码实现扫描二维码条形码] AVCaptureDevice

xiaoxiao2021-02-28  55

//参照别人的教程的作业贴

记录一下注意点

扫码的主要原生代码如下

这里比较关键的是对扫码作用范围的确定,metdataOutput.rectOfInterest 如果不设置,那么默认就是全屏都是作用域.如果设置,那么需要注意,它的作用范围不是具体的CGpoint点,而是范围比例,因此要在width/height上除以实际的屏幕宽高,最后也是最重要的一点就是,机器设备扫码时,是默认工作状态为横屏的 也就是说 你的扫码框的原点由左上角->变为了右上角, 只要你交换一下x/y 的点和宽高 ,就可以获取正确的作用域(如果扫码框是正方形的更好)

//1.获取摄像设备 avDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //2.创建输入流 AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:avDevice error:nil]; //3.创建输出流 AVCaptureMetadataOutput *metdataOutput = [[AVCaptureMetadataOutput alloc] init]; //设置代理 在主线程刷新 [metdataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; //3.1 设置扫码框作用范围 (由于扫码时系统默认横屏关系, 导致作用框原点变为我们绘制的框的右上角,而不是左上角) 且参数为比率不是像素点 metdataOutput.rectOfInterest = CGRectMake(scanContent_Y/layerBounds.size.height, scanContent_X/layerBounds.size.width, (layerBounds.size.width - 2 * scanContent_X)/layerBounds.size.height, (layerBounds.size.width - 2 * scanContent_X)/layerBounds.size.width); //4.初始化连接对象 avSession = [[AVCaptureSession alloc] init]; //设置高质量采集率 [avSession setSessionPreset:AVCaptureSessionPresetHigh]; //组合 [avSession addInput:input]; [avSession addOutput:metdataOutput]; //设置扫码格式支持的码(一定要在 session 添加 addOutput之后再设置 否则会爆) metdataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code]; //展示layer AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:avSession]; layer.videoGravity = AVLayerVideoGravityResizeAspectFill; layer.frame = self.layer.bounds; [self.layer insertSublayer:layer atIndex:0]; [avSession startRunning];

第二个注意的动画位移问题

// line移动的范围为 一个扫码框的高度(由于图片问题再减去图片的高度) CABasicAnimation * lineAnimation = [self animationWith:@(0) toValue:@(scanContent_layerH - lineimgViewH) repCount:MAXFLOAT duration:1.5f]; [lineImgView.layer addAnimation:lineAnimation forKey:@"LineImgViewAnimation"];

Demo在此: https://github.com/tianNanYiHao/saoOrangeCode

转载请注明原文地址: https://www.6miu.com/read-80139.html

最新回复(0)