详细易懂的二维码的扫描、识别与生成。

 

ios7之前我们实现二维码扫描是借助第三方(ZBarZXing等)来实现的,在ios7之后系统自己提供二维码扫描的方法,性能也要比第三方更好。

今天就来介绍一下原生二维码的使用,包括扫描二维码从图片扫描二维码生成二维码。讲解中只展示部分代码,具体请看Github Demo,里面的代码不多,也很容易看懂。

扫描二维码

二维码扫描需要用到AVFoundation.framework,需要用先创建一个AVCaptureSession,然后设置输入输出流,以及扫描区域和支持的格式:

//获取摄像设备
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()]; //设置扫描区域的比例 CGFloat width = 300 / CGRectGetHeight(self.view.frame); CGFloat height = 300 / CGRectGetWidth(self.view.frame); output.rectOfInterest = CGRectMake((1 - width) / 2, (1- height) / 2, width, height); AVCaptureSession *session = [[AVCaptureSession alloc] init]; //高质量采集率 [session setSessionPreset:AVCaptureSessionPresetHigh]; [session addInput:input]; [session addOutput:output]; //设置扫码支持的编码格式(这里设置条形码和二维码兼容) output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];

然后用这个session生成一个AVCaptureVideoPreviewLayer加到某个view的layer上,就可以实时显示摄像头捕捉的内容了:

AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
layer.videoGravity = AVLayerVideoGravityResizeAspectFill; layer.frame = self.view.layer.bounds; [self.view.layer insertSublayer:layer atIndex:0];

然后调用[self.session startRunning];开始捕获,当扫描出结果后会调用下面的代理方法,其中metadataObject.stringValue就是扫描后的结果。

#pragma mark - AVCaptureMetadataOutputObjectsDelegate
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { if (metadataObjects.count > 0) { AVMetadataMachineReadableCodeObject *metadataObject = [metadataObjects firstObject]; } }

为了在黑夜也可以很好的扫描,可以设置一个闪光灯的开关:

#pragma mark - 开关闪光灯
- (void)rightBarButtonDidClick:(UIBarButtonItem *)item
{self.flashOpen = !self.flashOpen; AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; if ([device hasTorch] && [device hasFlash]) { [device lockForConfiguration:nil]; if (self.flashOpen) { device.torchMode = AVCaptureTorchModeOn; device.flashMode = AVCaptureFlashModeOn; } else { device.torchMode = AVCaptureTorchModeOff; device.flashMode = AVCaptureFlashModeOff; } [device unlockForConfiguration]; } }

扫描二维码

从图片扫描

有时候我们需要从图片中扫描二维码,或者从相册选择一张图片,代码如下,具体可以看demo。其中feature.messageString就是扫描后的结果。

- (void)findQRCodeFromImage:(UIImage *)image
{CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}]; NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:image.CGImage]]; if (features.count >= 1) { CIQRCodeFeature *feature = [features firstObject]; } }

从图片扫描

生成二维码

生成二维码的代码很简单,代码如下。

/** 生成指定大小的黑白二维码 */
- (UIImage *)createQRImageWithString:(NSString *)string size:(CGSize)size
{NSData *stringData = [string dataUsingEncoding:NSUTF8StringEncoding]; CIFilter *qrFilter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; // NSLog(@"%@",qrFilter.inputKeys); [qrFilter setValue:stringData forKey:@"inputMessage"]; [qrFilter setValue:@"M" forKey:@"inputCorrectionLevel"]; CIImage *qrImage = qrFilter.outputImage; //放大并绘制二维码 (上面生成的二维码很小,需要放大) CGImageRef cgImage = [[CIContext contextWithOptions:nil] createCGImage:qrImage fromRect:qrImage.extent]; UIGraphicsBeginImageContext(size); CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetInterpolationQuality(context, kCGInterpolationNone); //翻转一下图片 不然生成的QRCode就是上下颠倒的 CGContextScaleCTM(context, 1.0, -1.0); CGContextDrawImage(context, CGContextGetClipBoundingBox(context), cgImage); UIImage *codeImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); CGImageRelease(cgImage); return codeImage; }

黑白二维码

上面默认生成的时黑白二维码,不过我们也可以改颜色:

/** 为二维码改变颜色 */
- (UIImage *)changeColorForQRImage:(UIImage *)image backColor:(UIColor *)backColor frontColor:(UIColor *)frontColor { CIFilter *colorFilter = [CIFilter filterWithName:@"CIFalseColor" keysAndValues: @"inputImage",[CIImage imageWithCGImage:image.CGImage], @"inputColor0",[CIColor colorWithCGColor:frontColor.CGColor], @"inputColor1",[CIColor colorWithCGColor:backColor.CGColor], nil]; return [UIImage imageWithCIImage:colorFilter.outputImage]; }

为二维码改变颜色

有的二维码也会在中心加一个小图片,例如用户头像,代码如下:

/** 在二维码中心加一个小图 */
- (UIImage *)addSmallImageForQRImage:(UIImage *)qrImage
{UIGraphicsBeginImageContext(qrImage.size); [qrImage drawInRect:CGRectMake(0, 0, qrImage.size.width, qrImage.size.height)]; UIImage *image = [UIImage imageNamed:@"small"]; CGFloat imageW = 50; CGFloat imageX = (qrImage.size.width - imageW) * 0.5; CGFloat imgaeY = (qrImage.size.height - imageW) * 0.5; [image drawInRect:CGRectMake(imageX, imgaeY, imageW, imageW)]; UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return result; }

中心加小图的二维码

其实也可以扫描条形码,大家可以对着条形码试一试,代码都是通用的。

转载于:https://www.cnblogs.com/zyjzyj/p/6029982.html

二维码的扫描、识别与生成相关推荐

  1. Android 二维码/条形码的识别或生成

    序言 二维码/条形码是生活中非常常见的技术,只要通过手机或者扫码枪扫描一下就能读取到里面的信息,给我们的生活带来了很多的便利.在Android开发当中,这也是很常用的技术.本文主要简单的介绍所用到的工 ...

  2. 微信小程序文字链接生成二维码,扫描识别二维码

    给大家推荐一个非常实用且有趣的微信小程序:超实用工具箱. 超实用工具箱小程序里面包含了很多小工具,涵盖了工作.日常生活和娱乐版块.具体的功能大家可以打开微信扫描下方二维码,即刻体验: 接下来给大家介绍 ...

  3. Oc 二维码的扫描-ZBar与生成

    如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.而手机等移动设备又成为二维码的一个很好的应用平台,不管是生成二维码还是扫码二维码. 1.前言 目前市场主流APP里,二维码/条形码集 ...

  4. VUE中:printJS使用,附带JsBarcode条码生成器,网页转图片html2canvas,base64上传保存处理,二维码生成库qrcode,二维码/条码扫描识别,domtoimage

    官网 JsBarcode官网 JsBarcode的GitHub-WIKI 我的项目需求只需要将配置好的HTML与CSS样式传入进去就好,较为简单. 九个月后html2canvas出现线上问题 设置了跨 ...

  5. ReactNative从相册选取二维码 进行扫描识别、扫描条形码、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

    我的demo 地址 http://github.com/yrjwcharm/react-native-scanner-qrcode 博友直接 下载压缩包 或者git clone 因为我的版本比较高.所 ...

  6. Android开发--Zxing库实现二维码/条形码扫描识别

    首先要下载所需要的源码,可以从zxing官网下载,下载压缩包然后解压到自己要放的地址 然后导入zxing包,下载的zxing源码中我们能用到的大概就camera,decoding,view三个包,可直 ...

  7. 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

    GitHub项目的链接地址 目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 ZXing 生成可自定义颜色.带 logo 的二维 ...

  8. QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式...

    QRCode 扫描二维码.扫描条形码.相册获取图片后识别.生成带 Logo 二维码.支持微博微信 QQ 二维码扫描样式 参考链接:https://github.com/bingoogolapple/B ...

  9. 分享一款电脑使用的二维码/条码扫描生成软件--二维码识别精灵

    功能: 从摄像头识别二维码.条码 从文件读取二维码.条码 识别屏幕中的二维码.条码 文本生成二维码,支持导出为图片 绿色软件,免安装,使用简单,没有病毒 体积小而效率高,运行速度快 摄像头毫秒级的识别 ...

最新文章

  1. All in one:如何搭建端到端可观测体系
  2. 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题
  3. react学习(6)----react样式多用内联
  4. 详解HTML5网页结构
  5. 190728每日一句 不经一番寒彻骨 怎得梅花扑鼻香,一个人怎样保持激情去奋斗?
  6. 使用php制作wap网站
  7. AllenNLP使用Predictor进行预测
  8. Python进阶之路(3):提取公众号后台数据并数据可视化
  9. 华为认证双IE网络工程师,花了三天时间整理的OSPF详解,建议收藏
  10. css 3D 旋转 - Demo
  11. SAN存储交换机配置
  12. 瘦AP如何连接到无线控制器AC
  13. gcc编译C++ 符号名解码 c++filt demangle
  14. ActiveMQ 反序列化漏洞(CVE-2015-5254)
  15. activator类的使用
  16. 蒟蒻的笔记本二、tarjan
  17. 两连杆机器鱼的简单建模以及MATLAB仿真
  18. 开涛spring3(6.9) - AOP 之 6.9 代理机制
  19. PCL中的OpenNI采集卡框架(The OpenNI Grabber Framework in PCL)
  20. 荣耀卖掉会有鸿蒙系统吗,华为为什么要把荣耀卖掉 荣耀卖掉之后依然还是那个荣耀吗?...

热门文章

  1. MySQL:常用分库分表方法
  2. js去除html空格字符,js去掉html标签和去掉字符串文本的所有的空格
  3. CSS(卓音前端之旅第二站)
  4. 物联网或迎爆发式增长 爱立信加快布局窄带物联网
  5. 计算机硬盘是什么形状,四种最常见的SSD硬盘的外形、应用及未来市场发展
  6. RCU 原理与实现分析
  7. SQL—MySQL基础教程(新手向)
  8. Arthas watch命令使用
  9. 关于大数据系统及Hadoop系统中的概念
  10. java程序画企鹅_JAVA编程实现添加多个企鹅信息到list中