iOS_原生相机二维码扫描与生成
写在最前面(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_原生相机二维码扫描与生成相关推荐
- iOS原生实现二维码扫描
iOS原生实现二维码扫描 最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时 ...
- iOS 原生二维码扫描和生成
代码地址如下: http://www.demodashi.com/demo/12551.html 一.效果预览: 功能描述:WSLNativeScanTool是在利用原生API的条件下封装的二维码扫描 ...
- Android zxing,轻松实现二维码扫描、生成
Android zxing,轻松实现二维码扫描.生成 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有, ...
- Android之二维码扫描和生成
一:效果图 二:实现步骤 1.导入第三方架包,下载地址: http://download.csdn.net/detail/android_cll/9784977 2.在项目build.gradle文件 ...
- 如何给iOS应用添加原生的二维码扫描功能
之前总觉得二维码扫描很高大上,其实apple工程师早就为我们提供了便捷的方法.二维码扫描第三方的库也挺多的,不过效率高的当属系统提供的扫描方法. 二维码扫描主要用到了以下几个类: AVCaptureD ...
- QRCode二维码扫描和生成
使用zxing的第三方抽取包,简单的几行代码就可以完成. 首先,下载第三方抽取包libzxing 将其按一个model导入到我们建好的app中,添加model引用,添加权限. model倒入后的结构如 ...
- 使用开源代码实现二维码扫描和生成
Github下载开源代码https://github.com/搜搜索zxing 把BarCodeTest导到ADT中,然后建立自己的工程TestQRcode,并关联BarCodeTest.在TestQ ...
- Android zxing 二维码扫描和生成方法(简单版)
前言 二维码大家都见识过,这里就不废话了,直接来干货. 步骤 导入依赖 compile 'com.google.zxing:core:3.2.1' //zxing核心依赖compile 'com.jo ...
- android二维码扫描和生成
http://www.open-open.com/lib/view/open1344150168061.html http://blog.csdn.net/shimiso/article/detail ...
最新文章
- 【开发工具】学习记录 初学MATLAB
- 关于msbuild 编译.net 4.5新语法错误的解决方法
- steelray project viewer
- _不懂操作?手把手教你如何在linux下搭建FTP
- python插入排序算法详解-面试常考
- 博客园去除文章页底部的推广链接
- 2021汽车产业数字化转型白皮书-腾讯研究院.pdf(附下载链接)
- Tiny Jpeg Decoder (JPEG解码程序) 源代码分析 1:解码文件头
- Devcpp中编译出现[errror]Id returned 1 exit status
- 港股通接口获取香港交易所上市股票的基本信息
- PS CS6中文如何切换成英文版界面?
- python 文本转excel_Python 文本(txt) 转换成 EXCEL(xls)
- MySQL 5.6.21下载安装之安装篇(二)
- throws和throw的作用
- rua出300道四则运算题
- VS2019与fluter通过MethodChannel进行双向通信(原创)
- Android的显示色彩位数
- 基于python-实训基地管理系统-django框架计算机毕业设计源码+系统+数据库+lw文档+调试部署
- 搜索迅雷快传资源的方法~
- 发明导诊机器人团队_潮阳这个医院来了一位智能导诊机器人!