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

news/2024/7/20 20:07:09 标签: 二维码, 条形码, ios, 原生实现

这里写图片描述

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

记录一下注意点

扫码的主要原生代码如下

这里比较关键的是对扫码作用范围的确定,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


http://www.niftyadmin.cn/n/1557313.html

相关文章

[十一]JavaIO之DataInputStream 和 DataOutputStream

功能简介 DataInputStream和DataOutputStream 继承了各自的FilterInputStream以及FilterOutputStream 使用装饰器模式对InputStream和OutputStream进行功能增强 FilterInputStream以及FilterOutputStream 都是Decorator 抽象的装饰器角色(并不是抽象类)他们内部都包含了各自需要…

[iOS 原生代码实现 二维码的生成与读取(转)]通过滤镜CIFilter生成二维码

二维码的生成 从iOS7开始集成了二维码的生成和读取功能 此前被广泛使用的zbarsdk目前不支持64位处理器 生成二维码的步骤: 导入CoreImage框架 通过滤镜CIFilter生成二维码 二维码的内容(传统的条形码只能放数字): 纯文本 名片 URL 具体帖子看这…

saltstack系列~第四篇

简介 针对mysql的sls编写0 软件包推送部分 tool_rsync: file.recurse: - source: salt://files/mysql - name: /data/soft/ - user: root - group: root - dir_mode: 755 - file_mode: 644 - makedirs: True - b…

[iOS开发:通讯录获取 转]

iOS开发:通讯录获取 http://blog.csdn.net/gongwutianya/article/details/52439925

Slog71_微信小程序之云开发-全栈时代3

ArthurSlog SLog-71 Year1 GuangzhouChina Sep 12th 2018 微信扫描二维码,关注我的公众号ArthurSlog Page GitHub NPM Package Page 掘金主页 简书主页 segmentfault 道常无为而无不为 开发环境MacOS(High Sierra 10.13.5) 需要的信息和信息源:…

[dSYM 分析命令集合]

需要的文件 crash日志-> 不管你从何而来,必须要有dSYM文件, 在编译的 xxx.app 文件中 就有 symbolicatecrash 工具 symbolicatecrash工具的获取 终端输入, 要等一会儿 看看输出的几个 symbolicatecrash 地址 find /Applications/Xcode.app -name symbolicatecrash -type…

【常见错误】--Nltk使用错误

一、错误类型 AttributeError: module nltk has no attribute word_tokenize 二、情形及解决办法 安装了nltk后,无法使用,报错如上,错误原因是在命名时使用和包一样的名字,导致无法导入。截图如下。 因此,只需修改文件…

[iOS 项目中用的MQTT以及注意点记录]

目前项目中用的是这个MQTT处理,,没有采用GithHub上的MQTTClient 但是用下来发现,项目中目前使用的这个方案也是可以满足需要的 目前使用的是这个 iOS,MQTTClient使用 http://www.cnblogs.com/douniwanxia/p/6580175.html 下面记录一下问题 MQTT的断开; 问题一 无论是什…