二维码的扫描、识别与生成
详细易懂的二维码的扫描、识别与生成。
ios7之前我们实现二维码扫描是借助第三方(ZBar
,ZXing
等)来实现的,在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]; } }
![](http://upload-images.jianshu.io/upload_images/1608265-268a61962145720c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
从图片扫描
有时候我们需要从图片中扫描二维码,或者从相册选择一张图片,代码如下,具体可以看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]; } }
![](http://upload-images.jianshu.io/upload_images/1608265-2b1fa03e6a50237b.gif?imageMogr2/auto-orient/strip)
生成二维码
生成二维码的代码很简单,代码如下。
/** 生成指定大小的黑白二维码 */
- (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; }
![](http://upload-images.jianshu.io/upload_images/1608265-dc0ad3554614009f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
上面默认生成的时黑白二维码,不过我们也可以改颜色:
/** 为二维码改变颜色 */
- (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]; }
![](http://upload-images.jianshu.io/upload_images/1608265-7211754266ea9998.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
有的二维码也会在中心加一个小图片,例如用户头像,代码如下:
/** 在二维码中心加一个小图 */
- (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; }
![](http://upload-images.jianshu.io/upload_images/1608265-b904ed48d3a825fd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
其实也可以扫描条形码,大家可以对着条形码试一试,代码都是通用的。
转载于:https://www.cnblogs.com/zyjzyj/p/6029982.html
二维码的扫描、识别与生成相关推荐
- Android 二维码/条形码的识别或生成
序言 二维码/条形码是生活中非常常见的技术,只要通过手机或者扫码枪扫描一下就能读取到里面的信息,给我们的生活带来了很多的便利.在Android开发当中,这也是很常用的技术.本文主要简单的介绍所用到的工 ...
- 微信小程序文字链接生成二维码,扫描识别二维码
给大家推荐一个非常实用且有趣的微信小程序:超实用工具箱. 超实用工具箱小程序里面包含了很多小工具,涵盖了工作.日常生活和娱乐版块.具体的功能大家可以打开微信扫描下方二维码,即刻体验: 接下来给大家介绍 ...
- Oc 二维码的扫描-ZBar与生成
如今二维码随处可见,无论是实物商品还是各种礼券都少不了二维码的身影.而手机等移动设备又成为二维码的一个很好的应用平台,不管是生成二维码还是扫码二维码. 1.前言 目前市场主流APP里,二维码/条形码集 ...
- VUE中:printJS使用,附带JsBarcode条码生成器,网页转图片html2canvas,base64上传保存处理,二维码生成库qrcode,二维码/条码扫描识别,domtoimage
官网 JsBarcode官网 JsBarcode的GitHub-WIKI 我的项目需求只需要将配置好的HTML与CSS样式传入进去就好,较为简单. 九个月后html2canvas出现线上问题 设置了跨 ...
- ReactNative从相册选取二维码 进行扫描识别、扫描条形码、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
我的demo 地址 http://github.com/yrjwcharm/react-native-scanner-qrcode 博友直接 下载压缩包 或者git clone 因为我的版本比较高.所 ...
- Android开发--Zxing库实现二维码/条形码扫描识别
首先要下载所需要的源码,可以从zxing官网下载,下载压缩包然后解压到自己要放的地址 然后导入zxing包,下载的zxing源码中我们能用到的大概就camera,decoding,view三个包,可直 ...
- 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式
GitHub项目的链接地址 目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 ZXing 生成可自定义颜色.带 logo 的二维 ...
- QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式...
QRCode 扫描二维码.扫描条形码.相册获取图片后识别.生成带 Logo 二维码.支持微博微信 QQ 二维码扫描样式 参考链接:https://github.com/bingoogolapple/B ...
- 分享一款电脑使用的二维码/条码扫描生成软件--二维码识别精灵
功能: 从摄像头识别二维码.条码 从文件读取二维码.条码 识别屏幕中的二维码.条码 文本生成二维码,支持导出为图片 绿色软件,免安装,使用简单,没有病毒 体积小而效率高,运行速度快 摄像头毫秒级的识别 ...
最新文章
- All in one:如何搭建端到端可观测体系
- 【强烈推荐】《剑指Offer:名企面试官精讲典型编程题》一书中IT名企经典面试题
- react学习(6)----react样式多用内联
- 详解HTML5网页结构
- 190728每日一句 不经一番寒彻骨 怎得梅花扑鼻香,一个人怎样保持激情去奋斗?
- 使用php制作wap网站
- AllenNLP使用Predictor进行预测
- Python进阶之路(3):提取公众号后台数据并数据可视化
- 华为认证双IE网络工程师,花了三天时间整理的OSPF详解,建议收藏
- css 3D 旋转 - Demo
- SAN存储交换机配置
- 瘦AP如何连接到无线控制器AC
- gcc编译C++ 符号名解码 c++filt demangle
- ActiveMQ 反序列化漏洞(CVE-2015-5254)
- activator类的使用
- 蒟蒻的笔记本二、tarjan
- 两连杆机器鱼的简单建模以及MATLAB仿真
- 开涛spring3(6.9) - AOP 之 6.9 代理机制
- PCL中的OpenNI采集卡框架(The OpenNI Grabber Framework in PCL)
- 荣耀卖掉会有鸿蒙系统吗,华为为什么要把荣耀卖掉 荣耀卖掉之后依然还是那个荣耀吗?...