写在最前面(2020-09-16)发现看不懂以前自己写的扫码demo了!那就推倒重来吧。。。。

--------------------分割线--------------------

iOS7开始,苹果自带二维码识别。

备注一:Info.plist一定要记得添加申请使用摄像头:Privacy - Camera Usage Description

备注二:以下为今天重新编写的代码,可直接复制黏贴(以前的代码都删了)。

//
//  ViewController.m
//  ScanQR
//
//  Created by Jero on 2020/9/16.
//  Copyright © 2020 Jero. All rights reserved.
//#import "ViewController.h"#import <AVFoundation/AVFoundation.h>@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>@property (strong, nonatomic) AVCaptureSession *captureSession;
@property (strong, nonatomic) AVCaptureVideoPreviewLayer *videoPreviewLayer;
@property (strong, nonatomic) UIView *viewPreview;//扫描窗口@end@implementation ViewController- (void)viewDidLoad {[super viewDidLoad];// Do any additional setup after loading the view.// 判断是否授权访问相机AVAuthorizationStatus authStatus =  [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];if (authStatus != AVAuthorizationStatusAuthorized) {// 未授权,申请访问相机[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {if (granted) {dispatch_async(dispatch_get_main_queue(), ^{[self loadScanConfig];});}}];return;}else {[self loadScanConfig];}
}- (void)loadScanConfig {// 初始化链接对象self.captureSession = [[AVCaptureSession alloc] init];self.captureSession.sessionPreset = AVCaptureSessionPresetHigh;// 高帧率// 获取摄像设备,创建输入流AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:nil];if (input == nil) { return; }if ([self.captureSession canAddInput:input]) {[self.captureSession addInput:input];}// 图像输出AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];if ([self.captureSession canAddOutput:captureMetadataOutput]) {[self.captureSession addOutput:captureMetadataOutput];[captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatch_queue_create("myScanQRQueue",NULL)];[captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];//设置识别类型(一定要先 addOutput 再设置识别类型,否则会崩溃)}// 扫描窗口self.viewPreview = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 320)];[self.view addSubview:self.viewPreview];// 扫描的数据图像self.videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession];[self.videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];// 扫描结果显示到界面[self.videoPreviewLayer setFrame:self.viewPreview.layer.bounds];[self.viewPreview.layer addSublayer:self.videoPreviewLayer];// 开始捕获图像[self.captureSession startRunning];
}//获得的数据在 AVCaptureMetadataOutputObjectsDelegate 唯一定义的方法中
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{//判断是否有数据,是否是二维码数据if (metadataObjects != nil && [metadataObjects count] > 0) {AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {// 扫描结果:NSLog(@"扫描结果:%@", metadataObj.stringValue);// 结束扫描(如果不结束将会一直输出识别结果)
//            dispatch_async(dispatch_get_main_queue(), ^{
//                [self.captureSession stopRunning];
//                self.captureSession = nil;
//                [self.videoPreviewLayer removeFromSuperlayer];
//            });}}
}@end

扫描类型补充:

AVMetadataObjectTypeQRCode,

AVMetadataObjectTypeCode128Code,

AVMetadataObjectTypeEAN8Code,

AVMetadataObjectTypeUPCECode,

AVMetadataObjectTypeCode39Code,

AVMetadataObjectTypePDF417Code,

AVMetadataObjectTypeAztecCode,

AVMetadataObjectTypeCode93Code,

AVMetadataObjectTypeEAN13Code,

AVMetadataObjectTypeCode39Mod43Code

生成二维码:

+ (UIImage *)createQRUIImageFormUrl:(NSString *)qrString withSize:(CGFloat) size {NSData *stringData = [qrString dataUsingEncoding:NSUTF8StringEncoding];// 创建filterCIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"];// 设置内容和纠错级别[qrFilter setValue:stringData forKey:@"inputMessage"];[qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"];CIImage *image = qrFilter.outputImage;CGRect extent = CGRectIntegral(image.extent);CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));// 创建bitmap;size_t width = CGRectGetWidth(extent) * scale;size_t height = CGRectGetHeight(extent) * scale;CGColorSpaceRef cs = CGColorSpaceCreateDeviceGray();CGContextRef bitmapRef = CGBitmapContextCreate(nil, width, height, 8, 0, cs, (CGBitmapInfo)kCGImageAlphaNone);CIContext *context = [CIContext contextWithOptions:nil];CGImageRef bitmapImage = [context createCGImage:image fromRect:extent];CGContextSetInterpolationQuality(bitmapRef, kCGInterpolationNone);CGContextScaleCTM(bitmapRef, scale, scale);CGContextDrawImage(bitmapRef, extent, bitmapImage);// 保存bitmap到图片CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);CGContextRelease(bitmapRef);CGImageRelease(bitmapImage);return [UIImage imageWithCGImage:scaledImage];
}

---------- 已经没有了 ----------

iOS_原生相机二维码扫描与生成相关推荐

  1. iOS原生实现二维码扫描

    iOS原生实现二维码扫描 最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时 ...

  2. iOS 原生二维码扫描和生成

    代码地址如下: http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描 ...

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

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

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

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

  5. 如何给iOS应用添加原生的二维码扫描功能

    之前总觉得二维码扫描很高大上,其实apple工程师早就为我们提供了便捷的方法.二维码扫描第三方的库也挺多的,不过效率高的当属系统提供的扫描方法. 二维码扫描主要用到了以下几个类: AVCaptureD ...

  6. QRCode二维码扫描和生成

    使用zxing的第三方抽取包,简单的几行代码就可以完成. 首先,下载第三方抽取包libzxing 将其按一个model导入到我们建好的app中,添加model引用,添加权限. model倒入后的结构如 ...

  7. 使用开源代码实现二维码扫描和生成

    Github下载开源代码https://github.com/搜搜索zxing 把BarCodeTest导到ADT中,然后建立自己的工程TestQRcode,并关联BarCodeTest.在TestQ ...

  8. Android zxing 二维码扫描和生成方法(简单版)

    前言 二维码大家都见识过,这里就不废话了,直接来干货. 步骤 导入依赖 compile 'com.google.zxing:core:3.2.1' //zxing核心依赖compile 'com.jo ...

  9. android二维码扫描和生成

    http://www.open-open.com/lib/view/open1344150168061.html http://blog.csdn.net/shimiso/article/detail ...

最新文章

  1. 【开发工具】学习记录 初学MATLAB
  2. 关于msbuild 编译.net 4.5新语法错误的解决方法
  3. steelray project viewer
  4. _不懂操作?手把手教你如何在linux下搭建FTP
  5. python插入排序算法详解-面试常考
  6. 博客园去除文章页底部的推广链接
  7. 2021汽车产业数字化转型白皮书-腾讯研究院.pdf(附下载链接)
  8. Tiny Jpeg Decoder (JPEG解码程序) 源代码分析 1:解码文件头
  9. Devcpp中编译出现[errror]Id returned 1 exit status
  10. 港股通接口获取香港交易所上市股票的基本信息
  11. PS CS6中文如何切换成英文版界面?
  12. python 文本转excel_Python 文本(txt) 转换成 EXCEL(xls)
  13. MySQL 5.6.21下载安装之安装篇(二)
  14. throws和throw的作用
  15. rua出300道四则运算题
  16. VS2019与fluter通过MethodChannel进行双向通信(原创)
  17. Android的显示色彩位数
  18. 基于python-实训基地管理系统-django框架计算机毕业设计源码+系统+数据库+lw文档+调试部署
  19. 搜索迅雷快传资源的方法~
  20. 发明导诊机器人团队_潮阳这个医院来了一位智能导诊机器人!

热门文章

  1. 狗屁不通生成器问题(动态规划)
  2. 爬取天猫国际、京东全球购、淘宝全球购的商品数据
  3. 读《魔鬼经济学01》
  4. sqlDeveloper连接oracle
  5. Beginning简约博客emlog主题模板V3
  6. Flutter 多版本管理FVM安装与使用
  7. 结构重参数化之三:Diverse Branch Block
  8. html微信拆红包,用React加CSS3实现微信拆红包动画_html/css_WEB-ITnose
  9. 反转(reverse)
  10. wrk 性能测试工具详解