ios 中生成二维码和相册中识别二维码

iOS 使用CIDetector扫描相册二维码、原生扫描

原生扫描

  • iOS7之后,AVFoundation让我们终于可以使用原生扫描进行扫码了(二维码与条码皆可)AVFoundation可以让我们从设备中获取到输入流与输出流,从而获取二维码中包含的信息。
  • 实现原生扫描非常简单。
    1.先导入AVFoundation框架。
    <AVFoundation/AVFoundation.h>
    2.接着设置代理,实现代理回调方法
    AVCaptureMetadataOutputObjectsDelegate
    3.然后创建几个类即可:
    设备 AVCaptureDevice
    捕捉会话 AVCaptureSession
    输入流 AVCaptureDeviceInput
    输出流 AVCaptureMetadataOutput
    预览图层 AVCaptureVideoPreviewLayer
  • 下面是简单的代码实现示例
      NSError *error = nil;
      AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];//设备
      AVCaptureSession *session = [[AVCaptureSession alloc] init];//捕捉会话
      [session setSessionPreset:AVCaptureSessionPresetHigh];//设置采集率
      AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];//输入流
      AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];//输出流
      //添加到捕捉会话
      [session addInput:input];
      [session addOutput:output];
      //扫码类型:需要先将输出流添加到捕捉会话后再进行设置
      //这里只设置了可扫描二维码,有条码需要,在数组中继续添加即可
      [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
      //输出流delegate,在主线程刷新UI
      [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
      AVCaptureVideoPreviewLayer *videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];//预览
      videoPreviewLayer.frame = self.view.bounds;
      [self.view.layer insertSublayer:videoPreviewLayer atIndex:0];//添加预览图层
      //还可以设置扫描范围 output.rectOfInterest  不设置默认为全屏
      //开始扫描
      [session startRunning];
  • 接着实现扫码成功的回调方法
    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
        NSString *content = @"";
        AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;
        content = metadataObject.stringValue;//获取到二维码中的信息字符串
        //对此字符串进行处理(音效、网址分析、页面跳转等)
    }
  • 我们还可以添加扫码成功后的声音与振动效果,提高用户体验
    - (void)playBeep{
      SystemSoundID soundID;
      AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"滴-2"ofType:@"mp3"]], &soundID);
      AudioServicesPlaySystemSound(soundID);
      AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
    }

从相册获取二维码

  • iOS8之后,可以使用CIDetector(CIDetector可用于人脸识别)进行图片解析,从而使我们可以便捷的从相册中获取到二维码。
  • 1.调用系统相册,从系统相册中选取图片
    2.使用探测器(CIDetector)对选取的图片进行处理,取得图片二维码中包含的数据信息。
  • 下面是简单的代码实现示例
    - (void)choicePhoto{
      //调用相册
      UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
      imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
      imagePicker.delegate = self;
      [self presentViewController:imagePicker animated:YES completion:nil];
    }
    //选中图片的回调
    -(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
    {
      NSString *content = @"" ;
      //取出选中的图片
      UIImage *pickImage = info[UIImagePickerControllerOriginalImage];
      NSData *imageData = UIImagePNGRepresentation(pickImage);
      CIImage *ciImage = [CIImage imageWithData:imageData];
    
      //创建探测器
      CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyLow}];
      NSArray *feature = [detector featuresInImage:ciImage];
    
      //取出探测到的数据
      for (CIQRCodeFeature *result in feature) {
          content = result.messageString;
      }
      //进行处理(音效、网址分析、页面跳转等)
    }
时间: 2024-11-05 07:27:43

ios 中生成二维码和相册中识别二维码的相关文章

微信 6.5.1 for iOS发布 可以在朋友圈分享相册中的视频

今天微信 6.5.1 for iOS发布了,最主要的一个功能是可以在朋友圈分享相册中的视频,卖转发朋友圈视频软件的家伙估计要哭了.微信这次更新,更有利于个人号的运营,个人号的价值将更高.从现在起,直接升级到微信最新版本,然后点击别人朋友圈视频保存好,而后你就可以发了!朋友圈视频会是下一波微信流量红利吗? 怎么转发朋友圈的小视频? 1.长按朋友圈小视频,点击保存视频 2.发朋友圈小视频,直接从相册中选中刚刚保存的视频就能直接发送了 更详细的操作过程在这:微信转发朋友圈小视频就这么简单 微信的这个转

iOS 如何生成跳转到Appstore的链接及二维码

1.如果是在应用内部跳转到Appstore只需执行如下代码 [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"itms-apps://itunes.apple.com/app/id1061880281"]]; 其中 @"itms-apps://itunes.apple.com/app/id1061880281"为拼接地址,1061880281为应用在Appstore注册上线时产生的唯一I

iOS开发中,如何将图片保存本地相册中

- (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor whiteColor]; /* 保存图片有两种方式: 1>.按钮方式; 2>.长按图片方式; */ //显示图片 _imageV = [[UIImageView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)]; //[注意??] : "9.jpg" 这里是图片名

ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好;ZXing对j2me,j2se,还有Android等支持也比较好,如果你是搞Android的或以后准备走Android,建议还是用zxing的比较好,毕竟都一个母亲(goole)生的,QRCode就不用说了吧,虽说技术无国界,但是国人还是有点.... 好,言归正传,java用ZXi

(转)ZXing生成二维码和带logo的二维码,模仿微信生成二维码效果

场景:移动支付需要对二维码的生成与部署有所了解,掌握目前主流的二维码生成技术. 1 ZXing 生成二维码 首先说下,QRCode是日本人开发的,ZXing是google开发,barcode4j也是老美开发的,barcode4j对一维条形码处理的很好,而且支持的格式很多,当然也可以对二维码进行处理,效果个人感觉没有前两种好;ZXing对j2me,j2se,还有Android等支持也比较好,如果你是搞Android的或以后准备走Android,建议还是用zxing的比较好,毕竟都一个母亲(gool

iOS随机生成数字

有时候我们需要在程序中生成随机数,但是在Objective-c中并没有提供相应的函数,好在C中提供了rand().srand().random().arc4random()几个函数.那么怎么使用呢?下面将简单介绍: 1.  获取一个随机整数范围在:[0,100)包括0,不包括100 int x = arc4random() % 100; 2.  获取一个随机数范围在:[500,1000),包括500,包括1000 int y = (arc4random() % 501) + 500; 3.  获

Django中生成随机验证码

Django中生成随机验证码 1.html中a标签的设置 1 <img src="/get_validcode_img/" alt=""> 2.views中的get2.views中的getvalidcode_img设置 导入文件 1 import json 2 import os 3 import random 4 from django.contrib import auth 5 from django.shortcuts import render,

JAVA中生成二维码图片的方法

JAVA中生成二维码的方法并不复杂,使用google的zxing包就可以实现.下面的方法包含了生成二维码.在中间附加logo.添加文字功能. 一.下载zxing的架包,并导入项目中,如下: 最主要的包都在com.google.zxing.core下.如果是maven项目,maven依赖如下: 1 <dependency> 2 <groupId>com.google.zxing</groupId> 3 <artifactId>core</artifact

spa(单页应用)中,使用history模式时,微信长按识别二维码在ios下失效的问题

spa(单页应用,vue)中,使用history模式时,微信长按识别二维码在ios下失效的问题. 触发条件: spa单页应用: 路由模式 history 从其他页面跳转到带有微信二维码识别的页面(不是直接打开该页面) ios版本的微信(实测版本6.5.19) 结果: 二维码长按无法识别,刷新页面后恢复正常,安卓下正常. 解决方案: 1. 进入该页面的方式不使用路由跳转,而改为 <a href="xxx">目标二维码页面</a>的方式: 2. 在beforeCre