ios开发日记13-原生二维码的扫描和生成

今天博主有一个二维码扫描和生成的需求,遇到了一些困难点,在此和大家分享,希望能够共同进步.

从iOS7开始官方集成了二维码的扫描和生成功能 
此前被广泛使用的zbarsdk目前不支持64位处理器

1.扫描二维码

扫描二维码需要导入AVFoundation框架 
利用摄像头识别二维码中的内容(模拟器不行)

输入(摄像头) 
由会话将摄像头采集到的二维码图像转换成字符串数据 
输出(数据) 
由预览图层显示扫描场景

// 实例化拍摄设备

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

// 设置输入设备

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

// 设置元数据输出

// 实例化拍摄元数据输出

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

// 设置输出数据代理

[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

// 添加拍摄会话

// 实例化拍摄会话

AVCaptureSession *session = [[AVCaptureSession alloc] init];

// 添加会话输入

[session addInput:input];

// 添加会话输出

[session addOutput:output];

// 设置输出数据类型,需要将元数据输出添加到会话后,才能指定元数据类型,否则会报错

[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

// 视频预览图层

// 实例化预览图层

AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];

preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

preview.frame = self.view.bounds;

// 将图层插入当前视图

[self.view.layer insertSublayer:preview atIndex:100];

self.previewLayer = preview;

// 启动会话

[_session startRunning];

2.扫描二维码实例

@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>

@property (nonatomic, strong) AVCaptureSession *session;

@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;

@end

@implementation ViewController

- (void)viewDidLoad

{

[super viewDidLoad];

// 1. 实例化拍摄设备

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

// 2. 设置输入设备

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

// 3. 设置元数据输出

// 3.1 实例化拍摄元数据输出

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

// 3.3 设置输出数据代理

[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

// 4. 添加拍摄会话

// 4.1 实例化拍摄会话

AVCaptureSession *session = [[AVCaptureSession alloc] init];

// 4.2 添加会话输入

[session addInput:input];

// 4.3 添加会话输出

[session addOutput:output];

// 4.3 设置输出数据类型,需要将元数据输出添加到会话后,才能指定元数据类型,否则会报错

[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

self.session = session;

// 5. 视频预览图层

// 5.1 实例化预览图层, 传递_session是为了告诉图层将来显示什么内容

AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];

preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

preview.frame = self.view.bounds;

// 5.2 将图层插入当前视图

[self.view.layer insertSublayer:preview atIndex:100];

self.previewLayer = preview;

// 6. 启动会话

[_session startRunning];

}

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {

// 会频繁的扫描,调用代理方法

// 1. 如果扫描完成,停止会话

[self.session stopRunning];

// 2. 删除预览图层

[self.previewLayer removeFromSuperlayer];

NSLog(@"%@", metadataObjects);

// 3. 设置界面显示扫描结果

if (metadataObjects.count > 0)

{

AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];

// 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!

NSLog(@"%@", obj.stringValue);

}

}

@end

3.二维码的生成

生成二维码的步骤: 
导入CoreImage框架 
通过滤镜CIFilter生成二维码

二维码的内容(传统的条形码只能放数字):纯文本,名片,URL

// 1. 实例化二维码滤镜

CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

// 2. 恢复滤镜的默认属性

[filter setDefaults];

// 3. 将字符串转换成

NSData NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];

// 4. 通过KVO设置滤镜inputMessage数据

[filter setValue:data forKey:@"inputMessage"];

// 5. 获得滤镜输出的图像

CIImage *outputImage = [filter outputImage];

// 6. 将CIImage转换成UIImage,并放大显示

return [UIImage imageWithCIImage:outputImage scale:20.0 orientation:UIImageOrientationUp];

4.生成二维码实例

- (void)viewDidLoad {

[super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

self.imgView=[[UIImageView alloc]initWithFrame:CGRectMake(100, 100, [UIScreen mainScreen].bounds.size.width/2.0, [UIScreen mainScreen].bounds.size.width/2.0)];

[self.view addSubview:_imgView];

[self erweima];

}

-(void)erweima

{

//二维码滤镜

CIFilter *filter=[CIFilter filterWithName:@"CIQRCodeGenerator"];

//恢复滤镜的默认属性

[filter setDefaults];

//将字符串转换成NSData

NSData *data=[@"www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding];

//通过KVO设置滤镜inputmessage数据

[filter setValue:data forKey:@"inputMessage"];

//获得滤镜输出的图像

CIImage *outputImage=[filter outputImage];

//将CIImage转换成UIImage,并放大显示

_imgView.image=[self createNonInterpolatedUIImageFormCIImage:outputImage withSize:100.0];

//如果还想加上阴影,就在ImageView的Layer上使用下面代码添加阴影

_imgView.layer.shadowOffset=CGSizeMake(0, 0.5);//设置阴影的偏移量

_imgView.layer.shadowRadius=1;//设置阴影的半径

_imgView.layer.shadowColor=[UIColor blackColor].CGColor;//设置阴影的颜色为黑色

_imgView.layer.shadowOpacity=0.3;

}

//改变二维码大小

- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size {

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];

}

时间: 2024-10-05 22:22:18

ios开发日记13-原生二维码的扫描和生成的相关文章

Android之二维码的扫描与生成

今天,来学习使用怎么实现二维码的扫一扫和二维码的生成. 要想实现二维码的扫一扫与二维码的生成,就得必须了解二维码的特征. QRcode: QRCode简介: QRCode全称Quick Response Code. 通过在一个矩形区域内使用黑白像素来进行编码. 高纠错性.高可用性.高识别性. ZXing简介: ZXing是一个开放源码的,用java实现的多种格式为1D/2D条码图形处理库,它包含了联系到其他语言的端口. ZXing可以实现使用手机的内置的摄像头完成条形码的扫描与解码. ZXing

二维码的扫描和生成--第三方开源--ZXing

ZXing的二维码功能的提取lib下载地址:https://github.com/xuyisheng/ZXingLib 1.扫描二维码: 我们扫描就是要用到这个CaptureActivity类,直接把上面下载地址里面下载了里面的libzxing作为Module,如下图: 首先加上权限: <!-- 相机 --> <uses-permission android:name="android.permission.CAMERA" /> <!-- 振动 -->

Android基于Google Zxing实现二维码/条形码扫描、生成二维码/条形码

 二维码/条形码生成器 二维码/条形码扫描器 一.二维码与条形码工作原理 目前的很多应用上都有扫码功能,当时微信推出二维码扫码功能时,觉得imagine,通过一张简单的图片就能扫描添加还有,还有分享名片功能(也是一张二维码图片,识别扫描). 下面小编将通过文章主要介绍QRCode方面技术. QRCode是被广泛应用的一种二维码,解码速度快.二维码相对于条形码来说,二维码的存储数据量更大,空间利用率高,有一定的容错性. 二维码原理介绍: 二维码是用某种特定的几何图形按一定的规律在平面上分布的黑

iOS系统原生二维码条形码扫描

本文讲述如何用系统自带的东东实现二维码扫描的功能:点击当前页面的某个按钮,创建扫描VIEW.细心的小伙伴可以发现 title被改变了,返回按钮被隐藏了.这个代码自己写就行了,与本文关系不大...绿色的线会上下跑,不要担心:D 实现效果如下: 1.在工程中添加框架AVFoundation.framework 2.声明代理:AVCaptureMetadataOutputObjectsDelegate . define 几个东东用来画框.画线: #define SCANVIEW_EdgeTop 40.

二维码扫描(iOS原生二维码扫描)

一.关于二维码扫描的第三方库有很多:例如比较常用的两个 1.ZBar SDK ZBar为我们提供了两种使用方式,一种是直接调用ZBar提供的ZBarReaderViewController打开一个扫描界面,另一种方式是使用ZBar提供的可以嵌在其他视图中的ZBarReaderView,实际项目中我们更可能会使用第二种方式,这可以让我们对界面做更多的定制,详细的百度查找相关文档来看. 2.ZXing(Github镜像地址)是一个开源的条码生成和扫描库(开源协议为Apache2.0).它不但支持众多

iOS之原生二维码扫描

做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以开始了. 一.做好准备工作,搭建UI IBOutlet.IBAction如下: @property (weak, nonatomic) IBOutlet UIView *vie

iOS:原生二维码扫描

做iOS的二维码扫描,有两个第三方库可以选择,ZBar和ZXing.今天要介绍的是iOS7.0后AVFoundation框架提供的原生二维码扫描. 首先需要添加AVFoundation.framework框架到你工程中build phase的"Link Binary With Libraries"之下,然后就可以开始了. 一.做好准备工作,搭建UI UI效果如图 IBOutlet.IBAction如下: @property (weak, nonatomic) IBOutlet UIVi

php微信开发之带参数二维码的使用

最近做微信PC端网页微信相关功能的开发,从一个新手的角度来说,微信公众号的文档还是不好理解的,网上找的帖子大都也都基本上是复制微信公众平台上给的文档,开发微信带参数二维码过程中还是遇到不少坑的,在此把我的开发过程比较详细的记录下,希望对大家有所帮助. 我本次开发使用的是认证服务号. 1 接入首先进入微信公众号 -> 基本配置 下面是基本配置的页面,在URL中填写服务器地址,这个地址就是接受微信推送事件的一个接口,我是使用thinkPHP框架开发的程序,在其中一个Module(Decoration

Android 开发中使用到二维码生成和解析

二维码生成 二维码解析 在项目的开发中, 使用二维码作为数据传递 交换 已经是常态了! 在这我也讲讲自己在项目开发中使用到的二维码. 生成二维码的开发流程 1 应用google 给我们提供的zxing.jar (建议官网下载) 2 使用zxing.jar 的MultiFormatWriter 类 生成一张二维码图片 核心代码块 /** * 方法说明:生成无图片二维码 */ @SuppressWarnings("unused") private Bitmap createTwoCode(