代码地址如下:
http://www.demodashi.com/demo/12551.html

一、效果预览:


功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描工具,支持二维码的扫描、识别图中二维码、生成自定义颜色和中心图标的二维码、监测环境亮度、打开闪光灯这些功能;WSLScanView是参照微信封装的一个扫一扫界面,支持线条颜色、大小、动画图片、矩形扫描框样式的自定义;这个示例本身就是仿照微信的扫一扫功能实现的。

二、实现

主要代码如下:

  • 初始化扫描识别对象
- (AVCaptureSession *)session{if (_session == nil){//获取摄像设备AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];//创建输入流AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];if (!input){return nil;}//创建二维码扫描输出流AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];//设置代理 在主线程里刷新[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];//设置采集扫描区域的比例 默认全屏是(0,0,1,1)//rectOfInterest 填写的是一个比例,输出流视图preview.frame为 x , y, w, h, 要设置的矩形快的scanFrame 为 x1, y1, w1, h1. 那么rectOfInterest 应该设置为 CGRectMake(y1/y, x1/x, h1/h, w1/w)。CGFloat x = CGRectGetMinX(self.scanFrame)/ CGRectGetWidth(self.preview.frame);CGFloat y = CGRectGetMinY(self.scanFrame)/ CGRectGetHeight(self.preview.frame);CGFloat width = CGRectGetWidth(self.scanFrame)/ CGRectGetWidth(self.preview.frame);CGFloat height = CGRectGetHeight(self.scanFrame)/ CGRectGetHeight(self.preview.frame);output.rectOfInterest = CGRectMake(y, x, height, width);// 创建环境光感输出流AVCaptureVideoDataOutput *lightOutput = [[AVCaptureVideoDataOutput alloc] init];[lightOutput setSampleBufferDelegate:self queue:dispatch_get_main_queue()];_session = [[AVCaptureSession alloc] init];//高质量采集率[_session setSessionPreset:AVCaptureSessionPresetHigh];[_session addInput:input];[_session addOutput:output];[_session addOutput:lightOutput];//设置扫码支持的编码格式(这里设置条形码和二维码兼容)output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeCode128Code];}return _session;
}
  • 扫描出结果的代理方法
#pragma mark -- AVCaptureMetadataOutputObjectsDelegate
//扫描完成后执行
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{if (metadataObjects.count > 0){AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjects firstObject];// 扫描完成后的字符//        NSLog(@"扫描出 %@",metadataObject.stringValue);if(self.scanFinishedBlock != nil){self.scanFinishedBlock(metadataObject.stringValue);}}
}
#pragma mark- AVCaptureVideoDataOutputSampleBufferDelegate的方法
//扫描过程中执行,主要用来判断环境的黑暗程度
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection{if (self.monitorLightBlock == nil) {return;}CFDictionaryRef metadataDict = CMCopyDictionaryOfAttachments(NULL,sampleBuffer, kCMAttachmentMode_ShouldPropagate);NSDictionary *metadata = [[NSMutableDictionary alloc] initWithDictionary:(__bridge NSDictionary*)metadataDict];CFRelease(metadataDict);NSDictionary *exifMetadata = [[metadata objectForKey:(NSString *)kCGImagePropertyExifDictionary] mutableCopy];float brightnessValue = [[exifMetadata objectForKey:(NSString *)kCGImagePropertyExifBrightnessValue] floatValue];//    NSLog(@"环境光感 : %f",brightnessValue);// 根据brightnessValue的值来判断是否需要打开和关闭闪光灯AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];BOOL result = [device hasTorch];// 判断设备是否有闪光灯if ((brightnessValue < 0) && result) {// 环境太暗,可以打开闪光灯了}else if((brightnessValue > 0) && result){// 环境亮度可以}if (self.monitorLightBlock != nil) {self.monitorLightBlock(brightnessValue);}}

三、用法

  • 实例化WSLNativeScanTool工具类和WSLScanView界面类;用法很简单,头文件里注释的也挺详细的。
//输出流视图UIView *preview  = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 0)];[self.view addSubview:preview];__weak typeof(self) weakSelf = self;//构建扫描样式视图_scanView = [[WSLScanView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 0)];_scanView.scanRetangleRect = CGRectMake(60, 120, (self.view.frame.size.width - 2 * 60),  (self.view.frame.size.width - 2 * 60));_scanView.colorAngle = [UIColor greenColor];_scanView.photoframeAngleW = 20;_scanView.photoframeAngleH = 20;_scanView.photoframeLineW = 2;_scanView.isNeedShowRetangle = YES;_scanView.colorRetangleLine = [UIColor whiteColor];_scanView.notRecoginitonArea = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];_scanView.animationImage = [UIImage imageNamed:@"scanLine"];_scanView.myQRCodeBlock = ^{[WSLNativeScanTool createQRCodeImageWithString:@"https://www.jianshu.com/u/e15d1f644bea" andSize:CGSizeMake(250, 250) andBackColor:[UIColor whiteColor] andFrontColor:[UIColor orangeColor] andCenterImage:[UIImage imageNamed:@"piao"]];createQRCodeController.qrString = @"https://www.jianshu.com/u/e15d1f644bea";};_scanView.flashSwitchBlock = ^(BOOL open) {[weakSelf.scanTool openFlashSwitch:open];};[self.view addSubview:_scanView];//初始化扫描工具_scanTool = [[WSLNativeScanTool alloc] initWithPreview:preview andScanFrame:_scanView.scanRetangleRect];_scanTool.scanFinishedBlock = ^(NSString *scanString) {NSLog(@"扫描结果 %@",scanString);[weakSelf.scanTool sessionStopRunning];[weakSelf.scanTool openFlashSwitch:NO];};_scanTool.monitorLightBlock = ^(float brightness) {NSLog(@"环境光感 : %f",brightness);if (brightness < 0) {// 环境太暗,显示闪光灯开关按钮[weakSelf.scanView showFlashSwitch:YES];}else if(brightness > 0){// 环境亮度可以,且闪光灯处于关闭状态时,隐藏闪光灯开关if(!weakSelf.scanTool.flashOpen){[weakSelf.scanView showFlashSwitch:NO];}}};[_scanTool sessionStartRunning];[_scanView startScanAnimation];

四、项目结构

五、其他补充

暂没
iOS 原生二维码扫描和生成

代码地址如下:
http://www.demodashi.com/demo/12551.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

iOS 原生二维码扫描和生成相关推荐

  1. iOS原生二维码扫描(一)

    首先搭建一个最初步的能识别出二维码信息的最基本框架: @interface ScanCodeViewController ()<AVCaptureMetadataOutputObjectsDel ...

  2. iOS 原生二维码扫描(可限制扫描区域)

    废话不多说,直接上代码 **先声明几个类** @interface QRCodeController ()<AVCaptureMetadataOutputObjectsDelegate>@ ...

  3. iOS 7原生二维码扫描中文gbk编码乱码的解决

    有的二维码生成的含有中文的数据编码是GBK编码,如百度二维码生成器,使用系统原生二维码扫描就会出现乱码,于是开始网上查阅,该试的方法都尝试过了,终于功夫不负有心人,问题得到了解决,先上代码 NSStr ...

  4. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

  5. Android zxing,轻松实现二维码扫描、生成

    Android  zxing,轻松实现二维码扫描.生成 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有, ...

  6. iOS开发—二维码扫描-郭宏志-专题视频课程

    iOS开发-二维码扫描-3869人已学习 课程介绍         本课程由扣丁学堂教学总监郭宏志老师讲授,主要讲解了iOS开发专题中的二维码扫描这一专题,内容包含了二维码扫描中的全部知识,让学员更多 ...

  7. Android之二维码扫描和生成

    一:效果图 二:实现步骤 1.导入第三方架包,下载地址: http://download.csdn.net/detail/android_cll/9784977 2.在项目build.gradle文件 ...

  8. IOS 原生二维码、条形码扫描for IOS7 (八)

    转自:http://blog.csdn.net/baidu_31071595/article/details/50878410 同类型文章:http://www.2cto.com/kf/201603/ ...

  9. iOS原生二维码扫码实现(含蒙版和扫码动画)

    #一.iOS实现原生扫码的意义 二维码扫码功能对于现在的iOS App开发来说是非常重要的. 通常为了节省开发时间,很多开发者会采用ZXing和ZBar等第三方SDK进行开发. 这样的好处是快速便捷, ...

最新文章

  1. Cassandra数据模型设计最佳实践
  2. 20亿参数,大型视觉Transformer来了,刷新ImageNet Top1,All you need is money!
  3. css毛玻璃效果白边_css3毛玻璃效果白边问题_html/css_WEB-ITnose
  4. axios_的配置对象详细说明---axios工作笔记007
  5. 远程打开其他电脑的computer management
  6. MACOS,应用签名后就崩溃?
  7. 我要做 Android 第三弹弹弹
  8. Ubuntu系统安装JDK教程
  9. PDF如何编辑,怎么修改PDF中的文字
  10. 二维数组循环赋值c语言,C/C++ 定义并赋值二维数组
  11. 逻辑运算符在c语言里的作用,C语言逻辑运算符有哪些
  12. LINUX PPP拨号永久在线保障机制
  13. 图片大小、像素、分辨率之间的关系
  14. sql injection violation, syntax error: ERROR
  15. Android:从源码剖析Hander机制
  16. Python之pip升级命令
  17. DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录 专题
  18. 在intellij上运行java_如何解决无法在IntelliJ中运行java 11示例程序?
  19. MySQL---数据库从入门走向大神系列(十)-Connection对象池、装饰模式与动态代理模式
  20. PotPlayer直播源推荐

热门文章

  1. 动态时间规整matlab和python代码
  2. 《画解数据结构》三张动图,画解哈希
  3. 如何快速开发H5列表页面
  4. C语言程序运行的步骤
  5. python利用有道的url来进行翻译英文单词与句子,并且实现了自动生成指定位置的文件夹来存储
  6. 请用flutter实现在macOS上实现鼠标右键弹出菜单的功能
  7. 哈工大深圳计算机学院老师信息的爬取
  8. 【Kali渗透全方位实战】通过获取到的hash进行密码破解!(Hashcat)
  9. Okio精简高效的IO库
  10. 智能电饭煲电路图及其原理_求奔腾智能电饭煲原理电路图