Swift5以及IOS15对于二维码的使用

info.plist 加入这句话,而且第三个功能必须在真机上运行,模拟机不行。

Privacy - Camera Usage Description


OC方式:

一,二维码生成:

关键性代码:

- (void)viewDidLoad {[super viewDidLoad];//self.qrImageView.image = [GeneratorQRCodeVC creatQRImage:@"123" withSize:200];UIImage *image1 = [GeneratorQRCodeVC creatQRImage:@"123" withSize:200];UIImage *center = [UIImage imageNamed:@"zhengshuang.jpeg"];image1 = [self getNewImage:image1 withCenter:center];self.qrImageView.image = image1;
}
+(UIImage *)creatQRImage:(NSString *)url withSize:(CGFloat)size{CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];[filter setDefaults];NSString *string = url;NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding allowLossyConversion:YES];[filter setValue:data forKeyPath:@"inputMessage"];CIImage *img= [filter outputImage];return [self setQRImage:img withSize:size];
}
+(UIImage *)setQRImage:(CIImage *)image withSize:(CGFloat)size{CGRect extent = CGRectIntegral(image.extent);CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));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);CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);CGContextRelease(bitmapRef);CGImageRelease(bitmapImage);return [UIImage imageWithCGImage:scaledImage];
}
-(UIImage *)getNewImage:(UIImage *)sourceImage withCenter:(UIImage *)center{CGSize size = sourceImage.size;UIGraphicsBeginImageContext(sourceImage.size);[sourceImage drawInRect:CGRectMake(0, 0, size.width, size.height)];CGFloat width = 40,height = 40;CGFloat x = (size.width - width) / 2;CGFloat y = (size.height - height) / 2;[center drawInRect:CGRectMake(x, y, width, height)];UIImage *resultImgae = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return resultImgae;
}
@end

利用图形上下文,绘制了一个小图在图片内部,

二,二维码识别:

- (IBAction)shiBie:(id)sender {UIImage *image = self.sourceImageView.image;CIImage *imageCI = [[CIImage alloc] initWithImage:image];//开始识别//创建一个二维码探测器CIDetector *detector =  [CIDetector  detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];//直接探测二维码特征NSString *strMSg = nil;NSArray<CIFeature *> *features = [detector featuresInImage:imageCI];for (CIFeature *feature in features) {CIQRCodeFeature *qrFeatrue = (CIQRCodeFeature *)feature;NSLog(@"%@",qrFeatrue.messageString);strMSg = qrFeatrue.messageString;}UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"结果" message:strMSg preferredStyle:UIAlertControllerStyleAlert];[self presentViewController:alert animated:YES completion:nil];dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3*NSEC_PER_SEC)), dispatch_get_main_queue(), ^{[alert dismissViewControllerAnimated:YES completion:nil];});
}

我这里识别的是单一的图片。可以识别多张图片。

三,扫描二维码:

扫描是最难的,最麻烦的。

//
//  ScanQRCodeVC.m
//  01-掌握二维码综合案例OC
//
//  Created by lujun on 2021/11/4.
//
#import <AVFoundation/AVFoundation.h>
#import "ScanQRCodeVC.h"
#import "UIView+Frame.h"
@interface ScanQRCodeVC ()<AVCaptureVideoDataOutputSampleBufferDelegate>
@property (weak, nonatomic) IBOutlet NSLayoutConstraint *bottomConstan;
@property (weak, nonatomic) IBOutlet UIImageView *qrBackView;
@property(nonatomic,weak)AVCaptureSession *session;
@end
@implementation ScanQRCodeVC
- (void)viewDidAppear:(BOOL)animated{[super viewDidAppear:animated];self.bottomConstan.constant = self.qrBackView.hm_height;[self.view layoutIfNeeded];self.bottomConstan.constant = -self.qrBackView.hm_height;[UIView animateWithDuration:2 animations:^{[UIView setAnimationsEnabled:YES];[UIView setAnimationRepeatCount:MAXFLOAT];[self.view layoutIfNeeded];}];
}
- (void)viewDidLoad {[super viewDidLoad];[self setupCaptureSession];
}
- (void)setupCaptureSession
{NSError *error = nil;AVCaptureSession *session = [[AVCaptureSession alloc] init];//负责输入和输出设置之间的数据传递session.sessionPreset = AVCaptureSessionPresetMedium;//设置分辨率AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:deviceerror:&error];if (!input) {}AVCaptureVideoDataOutput *output = [[AVCaptureVideoDataOutput alloc] init];//创建一个视频数据输出流if([session canAddInput:input] && [session canAddOutput:output] ){[session addInput:input];[session addOutput:output];}dispatch_queue_t queue = dispatch_queue_create("myQueue", NULL);[output setSampleBufferDelegate:self queue:queue];// Specify the pixel formatoutput.videoSettings = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:kCVPixelFormatType_32BGRA], kCVPixelBufferPixelFormatTypeKey,[NSNumber numberWithInt: 320], (id)kCVPixelBufferWidthKey,[NSNumber numberWithInt: 240], (id)kCVPixelBufferHeightKey,nil];AVCaptureVideoPreviewLayer* preLayer = [AVCaptureVideoPreviewLayer layerWithSession: session];//相机拍摄预览图层//preLayer = [AVCaptureVideoPreviewLayer layerWithSession:session];preLayer.frame = CGRectMake(0, 0, 320, 240);preLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;[self.view.layer addSublayer:preLayer];output.minFrameDuration = CMTimeMake(1, 15);[session startRunning];
}- (void)captureOutput:(AVCaptureOutput *)captureOutput
didOutputSampleBuffer:(CMSampleBufferRef)sampleBufferfromConnection:(AVCaptureConnection *)connection
{UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
}
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer
{CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);CVPixelBufferLockBaseAddress(imageBuffer, 0);void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);size_t width = CVPixelBufferGetWidth(imageBuffer);size_t height = CVPixelBufferGetHeight(imageBuffer);CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();CGContextRef context = CGBitmapContextCreate(baseAddress, width, height, 8,bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);CGImageRef quartzImage = CGBitmapContextCreateImage(context);CVPixelBufferUnlockBaseAddress(imageBuffer,0);CGContextRelease(context);CGColorSpaceRelease(colorSpace);UIImage *image = [UIImage imageWithCGImage:quartzImage];CGImageRelease(quartzImage);return (image);
}
@end

swift方式:

一。二维码的生成

override func viewDidLoad() {let str = inputTextView.text ?? ""super.viewDidLoad()self.title = "二维码生成";let filter = CIFilter(name: "CIQRCodeGenerator")filter?.setDefaults()let data = str.data(using: String.Encoding.utf8)filter?.setValue(data, forKey: "inputMessage")filter?.setValue("H", forKey: "inputCorrectionLevel")var image = filter?.outputImagelet transform = CGAffineTransform(scaleX: 20, y: 20)image = image?.transformed(by: transform)var resultImage = UIImage(ciImage: image!)let center  = UIImage(named: "zhengshuang.jpeg")!resultImage =  getNewImage(sourceImage: resultImage, center: center)qrCodeImageView.image = resultImage}func getNewImage(sourceImage: UIImage,center: UIImage) -> UIImage {let size = sourceImage.sizeUIGraphicsBeginImageContext(size)sourceImage.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))let width: CGFloat = 80let height: CGFloat = 80let x: CGFloat = (size.width - width) * 0.5let y: CGFloat = (size.height - height) * 0.5center.draw(in: CGRect(x: x, y: y, width: width, height: height))let resultImage = UIGraphicsGetImageFromCurrentImageContext()!UIGraphicsEndImageContext()return resultImage}

二,二维码的识别

        let image =  sourceImageView.imagelet imageCI = CIImage(image: image!)//开始识别//创建一个二维码探测器let dector = CIDetector(ofType: CIDetectorTypeQRCode, context: nil, options: [CIDetectorAccuracy: CIDetectorAccuracyHigh])//直接探测二维码特征let features = dector?.features(in: imageCI!)var resultImage = imagevar strMsg: String?var strMsgArr = [String]()for feature in features! {//            debugPrint(feature)let qrFeature = feature as! CIQRCodeFeaturedebugPrint(qrFeature.messageString)strMsgArr.append(qrFeature.messageString!)
//            debugPrint(qrFeature.bounds)resultImage = drawFrame(image: resultImage!, feature: qrFeature)sourceImageView.image = resultImagestrMsg = qrFeature.messageString}debugPrint(strMsg?.count)let al = UIAlertController(title: "结果", message: strMsgArr.description, preferredStyle: .alert)let action = UIAlertAction(title: "关闭", style: .cancel, handler: nil)self .present(al, animated: true, completion: nil)al.addAction(action)
   func drawFrame(image:UIImage,feature: CIQRCodeFeature) ->UIImage {let size = image.sizeUIGraphicsBeginImageContext(size)image.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))//转换坐标系 (上下颠倒)开始let context = UIGraphicsGetCurrentContext()!context.scaleBy(x: 1, y: -1)context.translateBy(x: 0, y: -size.height)
//        CGContextScaleCTM(context,1,-1) 函数过期
//        CGContextTranslateCTM(context,0,-size.height) 函数过期//转换坐标系 (上下颠倒) 结束let bounds = feature.boundslet path = UIBezierPath(rect: bounds)path.lineWidth = 6UIColor.red.setStroke()path.stroke()let resultImage = UIGraphicsGetImageFromCurrentImageContext()UIGraphicsEndImageContext()return resultImage!}

三,扫描二维码

import UIKit
import AVFoundation
class ScanQRCodeVC: UIViewController {var session: AVCaptureSession?weak var layer: AVCaptureVideoPreviewLayer?@IBOutlet weak var chongjiBoView: UIImageView!@IBOutlet weak var scanBackVIew: UIView!@IBOutlet weak var toBottom: NSLayoutConstraint!override func viewDidLoad() {super.viewDidLoad()title = "扫描二维码"}func startScan() -> Void{//1.获取 摄像头设备let device: AVCaptureDevice = AVCaptureDevice.default(for: .video)!var input: AVCaptureDeviceInput?do {input = try AVCaptureDeviceInput(device: device)}catch {debugPrint(error)return}//2.设置输出let output = AVCaptureMetadataOutput()//2.1 设置结果处理的代理output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)//3.创建会话session = AVCaptureSession()if session!.canAddInput(input!) && session!.canAddOutput(output) {session!.addInput(input!)session!.addOutput(output)}else{return}//3.1 设置二维码可以识别的码制output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]let bounds = UIScreen.main.boundslet x: CGFloat = scanBackVIew.frame.origin.x / bounds.size.widthlet y: CGFloat = scanBackVIew.frame.origin.y / bounds.size.heightlet width: CGFloat = scanBackVIew.frame.size.width / bounds.size.widthlet height: CGFloat = scanBackVIew.frame.size.height / bounds.size.heightoutput.rectOfInterest = CGRect(x: y, y: x, width: height, height: width)let layer = AVCaptureVideoPreviewLayer(session: session!)layer.frame = UIScreen.main.boundsview.layer.insertSublayer(layer, at: 0)//4.启动会话让输入开始菜单数据 输出对象 开始处理数据session!.startRunning()self.layer = layer}override func viewDidAppear(_ animated: Bool) {super.viewDidAppear(animated)toBottom.constant = scanBackVIew.frame.size.heightview.layoutIfNeeded()toBottom.constant = -scanBackVIew.frame.size.heightUIView.animate(withDuration: 2) {UIView.setAnimationRepeatCount(MAXFLOAT)self.view.layoutIfNeeded()}}override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {startScan()}func removeScanAnim(){chongjiBoView.layer.removeAllAnimations()}}extension ScanQRCodeVC : AVCaptureMetadataOutputObjectsDelegate{func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection){//        debugPrint("set")debugPrint(metadataObjects)for obj in metadataObjects {if obj.isKind(of: AVMetadataMachineReadableCodeObject.self) {let resultObj = self.layer?.transformedMetadataObject(for: obj)let qrCodeObj = resultObj as! AVMetadataMachineReadableCodeObjectdebugPrint(qrCodeObj.stringValue!)debugPrint(qrCodeObj.corners)
//                qrCodeObj.corners 代表二维码4个角 但是//  drawFrame(qrCodeObj: qrCodeObj)}}}func drawFrame(qrCodeObj: AVMetadataMachineReadableCodeObject) -> Void {let corners = qrCodeObj.corners//1.借助一个图形层let shapLayer = CAShapeLayer()let path = UIBezierPath()var index = 0;for corner in corners {let pointDic = corner as! CFDictionaryvar point = CGPoint.zero
//            CGPointMakeWithDictionaryRepresentation(pointDic, &point)
//            point = CGPoint.init(dictionaryRepresentation: pointDic)!point = CGPoint.init(dictionaryRepresentation: pointDic)!if index==0 {path.move(to: point)}else {path.addLine(to: point)}index += 1}shapLayer.path = path.cgPathlayer?.addSublayer(shapLayer)}
}

git地址
https://gitee.com/johnson__save_admin/qrcode-swift

Swift5以及IOS15对于二维码的使用相关推荐

  1. iOS15仿微信详情二维码支持保存本地相册

    iOS15仿微信详情二维码支持保存本地相册 具体实现步骤请在b站搜索上面标题

  2. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

  3. python3生成二维码中间带logo,有底图,可自定义文字

    效果: qrcode_result.png 代码: #!/user/bin/Python3 """ @Lanson @2019-11-02 ""&qu ...

  4. Asp.Net Core在线生成二维码

    前言: 原先用zxing Code写过基于Winfrom的批量生成二维码工具,以及单个生成二维码工具:批量生成二维码Gihub源代码 今天尝试用QRCoder 加 Asp.Net Core 写了一个在 ...

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

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

  6. 使用Python制作酷炫的二维码

    参考: https://www.cnblogs.com/zhuwjwh/p/11401312.html 制作动图二维码只需要原始图像是动图就可以哦~~,制作动图可以参考我之前的博客:

  7. 1行Python代码制作动态二维码

    目录 1.二维码简介 2.普通二维码 3.艺术二维码 4.动态二维码 1.二维码简介 目前流行的二维码(QR code)是1994年由日本Denso-Wave公司发明的.英文字中 QR 所代表的意义是 ...

  8. OpenCV(项目)二维码识别(二维码、条形码)

    目录 过程 1.获取图片中的二维码信息 2.获取视频中的二维码信息 3.检测出二维码框 4.显示数据 5.添加数据,判断二维码是否授权 5-1:.添加数据 5-2.读取文件信息,放入数组 5-3.判断 ...

  9. 【绝对靠谱】Vue生成二维码Qrcode,可插入二维码中心logo图标,可以设置二维码颜色大小等属性

    效果 代码 npm install vue-qr --save 个别网络用 cnpm install vue-qr --save 安装 <template><div class=&q ...

最新文章

  1. 《区块链原理、设计与应用》一3.3 征信和权属管理
  2. 成功解决Error: Cannot find module 'web3'
  3. redhat5 oracle11g安装全程详解,RedHat5+Oracle11g安装全程详解.doc
  4. Linux 网络编程八(epoll应用--大并发处理)
  5. HTTP/2 协议入门
  6. redis一般缓存什么样数据_SpringBoot+Redis轻松实现数据缓存
  7. Zdal分库分表中间件介绍
  8. python运用ico图标_如何优雅地处理Django中的favicon.ico图标详解
  9. php设计模式 — 单例模式(singleton)
  10. 阿里云技术专家入选Apache Member;百度Q1财报:营收241亿元;华为面向全球发布AI-Native数据库……...
  11. 太不可思议了,竟然用交通锥当 logo!
  12. SwiftUI CoreSpotlight 实战之实现Spotlight搜索(教程含源码)
  13. 【老九学堂】【初识C语言】C语言基本数据类型
  14. [数学学习笔记]函数的连续性
  15. 带你学微信小程序开发
  16. 2019 icpc南昌邀请赛 G Winner
  17. 燃气管道运行全局实时监控系统-海城支线总页面
  18. 【转载】第6节: 六类Calander处理六种不同的时间场景
  19. 八字易经算法之用JAVA实现日子吉凶星
  20. 1.1 Linux内核代码下载、编译

热门文章

  1. 稀疏矩阵十字链表类java_稀疏矩阵的十字链表存储表示
  2. 线程id 获取线程名称_016 线程及初步网络编程
  3. 福师计算机辅助设计1 ps 在线作业二,福师《计算机辅助设计1(PS)》在线作业一100分答案...
  4. eclipse html自动对齐,MyEclipse和Eclipse中jsp、html格式化自动排版问题
  5. 拉格朗日插值的优缺点_拉格朗日与牛顿插值法的比较
  6. python关系图谱_文本分析之制作网络关系图
  7. 饼图的引导线怎么加_4步学会EXCEL复合条饼图制作方法,让统计结果更直观!
  8. 到底要不要考研?读完研究生就能找到好工作了吗?
  9. 还没搞懂串口通信?一文带你读懂
  10. 电路常识性概念(3)-TTL与CMOS集成电路