二维码的生成

从iOS7開始集成了二维码的生成和读取功能

此前被广泛使用的zbarsdk眼下不支持64位处理器

生成二维码的步骤:

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

读取二维码

读取二维码须要导入AVFoundation框架

利用摄像头识别二维码中的内容(模拟器不行)

输入(摄像头)

由会话将摄像头採集到的二维码图像转换成字符串数据

输出(数据)

由预览图层显示扫描场景

设置拍摄会话

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

设置拍摄视频预览图层

// 5. 视频预览图层
// 5.1 实例化预览图层
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];

生成百度二维码实例

#import <CoreImage/CoreImage.h>

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UIImageView *iv; @end @implementation ViewController - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
// 1.实例化二维码滤镜
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; // 2.恢复滤镜的默认属性 (由于滤镜有可能保存上一次的属性)
[filter setDefaults]; // 3.将字符串转换成NSdata
NSData *data = [@"http://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding]; // 4.通过KVO设置滤镜, 传入data, 将来滤镜就知道要通过传入的数据生成二维码
[filter setValue:data forKey:@"inputMessage"]; // 5.生成二维码
CIImage *outputImage = [filter outputImage]; UIImage *image = [UIImage imageWithCIImage:outputImage]; // 6.设置生成好得二维码到imageview上
self.iv.image = image; } @end

实例图

读取百度二维码实例

#import <AVFoundation/AVFoundation.h>

@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

iOS开发 - 二维码的生成与读取的更多相关文章

  1. iOS开发--二维码的生成

    一.需要包含头文件 #import <CoreImage/CoreImage.h> 二.示例代码 -- 以下生成的二维码不够清晰 如图: - (void)touchesBegan:(NSS ...

  2. iOS开发-二维码扫描和应用跳转

    iOS开发-二维码扫描和应用跳转   序言 前面我们已经调到过怎么制作二维码,在我们能够生成二维码之后,如何对二维码进行扫描呢? 在iOS7之前,大部分应用中使用的二维码扫描是第三方的扫描框架,例如Z ...

  3. iOS开发-二维码的基本使用

    二维码在生活中出现的频率越来越多了,大街小巷各个角落,它的出现更大的作用是代替功能单一的传统条形码,但是通常很多人第一次见到这个都不清楚这是干嘛用的.最初第一次见到可能就是买到的商品上有一个数字的条形 ...

  4. iOS开发 二维码生成

    基于libqrencode的二维码生成 + (void)drawQRCode:(QRcode *)code context:(CGContextRef)ctx size:(CGFloat)size { ...

  5. IOS开发 二维码功能的实现

    原帖地址:http://yul100887.blog.163.com/blog/static/20033613520121020611299/ 如今二维码随处可见,无论是实物商品还是各种礼券都少不了二 ...

  6. iOS 7 二维码的生成

    //二维码生成 //UIImageView *theImageView = [[UIImageView alloc]init]; //[self.view addSubview:theImageVie ...

  7. iOS开发--二维码的扫描

    一.需要包含头文件 #import <AVFoundation/AVFoundation.h> 二.通过设置<AVCaptureMetadataOutputObjectsDelega ...

  8. JAVA开发--[二维码名片生成系统]

    上个月学校有个软件创新杯,最近看了网上很火的二维码比较不错.参考了国内国外一些技术文章,发现国外的确实好很多. 用的是QRcode包来实现的,基本常见的功能全部实现了. 因为刚学2个月,部分做得不是很 ...

  9. iOS系统原生 二维码的生成、扫描和读取(高清、彩色)

    由于近期工作中遇到了个需求:需要将一些固定的字段 在多个移动端进行相互传输,所以就想到了 二维码 这个神奇的东东! 现在的大街上.连个摊煎饼的大妈 都有自己的二维码来让大家进行扫码支付.可见现在的二维 ...

随机推荐

  1. 读取bin文件,并且按结构体赋值打印

    目标:读取一个bin文件,并且将bin文件中的数据,按字节对齐赋值给结构体,并且打印出结构体的内容 目前思路是简单的先将bin文件数据一次性读到一个数组中,再将数组强制转换为结构体 ] FILE *f ...

  2. 【BZOJ 1486】 [HNOI2009]最小圈

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 我们可以只想那个均值最小的环. 我们不知道那个环由哪些边构成 但我们可以把每条边都减掉mid 那个环受到的影响是什么呢? 如果这个均 ...

  3. oracle 用户解锁和修改用户密码

    1.安装教程参看:https://jingyan.baidu.com/article/3c48dd34be2a32e10be35881.html 2.用户解锁 --> 运行cmd --> ...

  4. ajax 获取 json 数据乱码

    打开json文本把json文件另存为 'utf-8' 编码格式的文件.....

  5. Reentrant protected mode kernel using virtual 8086 mode interrupt service routines

    A method for allowing a protected mode kernel to service, in virtual 8086 mode, hardware interrupts ...

  6. 洛谷 P2932 [USACO09JAN]地震造成的破坏Earthquake Damage

    P2932 [USACO09JAN]地震造成的破坏Earthquake Damage 题目描述 Wisconsin has had an earthquake that has struck Farm ...

  7. JDBC连接mysql时出现的ssl问题

    使用MySQL数据库时出现如下错误: WARN: Establishing SSL connection without server's identity verification is not r ...

  8. 【MVC架构】——怎样利用Json在View和Controller之间传递数据

    在MVC架构中,尽管非常多东西和三层非常相似,可是也有非常大的差别.就比方传递数据.在三层架构中,传递数据就仅仅要一层返回,另外一层用同样类型的变量来接收即可了.在MVC中,事实上原理是一样的,Con ...

  9. html 标签: image也能提交form!!!

    html 标签: image也能提交form! !! image也能提交form 先前常常使用"<input type="submit" value="i ...

  10. node09---中间件

    如果我的的get.post回调函数中,没有next参数,那么就匹配上第一个路由,就不会往下匹配了. 如果想往下匹配的话,那么需要写next() 1app.get("/",funct ...