iOS二维码的生成和扫码详细介绍(手把手教)

简介: iOS二维码的生成和扫码详细介绍(手把手教)
  • 二维码是用特定的几何图形来记录信息
  • 在之前,常用的二维码开发框架有:ZXingZBarSDK
  • 苹果从iOS7开始集成了二维码的生成和读取功能,并且之前的框架不支持64位,因此目前只是用苹果的框架即可


二.二维码的生成



  • 二维码的生成就是将固定的信息生成对应的二维码
  • 生成二维码的步骤:
    (1).导入CoreImage框架
    (2).通过滤镜CIFilter生成二维码
    <1>.创建滤镜对象
    <2>.设置滤镜的默认设置
    <3>.给滤镜设置数据(KVC)
    <4>.获取生成的二维码图形


下面是实际代码:


  • 1.导入#import <CoreImage/CoreImage.h> :此框架非常强大
  • 2.创建CIFilte(滤镜)对象


CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
  • 3.恢复滤镜默认设置


[filter setDefaults];
  • 4.设置数据(通过滤镜对象的KVC)


//存放的信息
NSString *info = @"我叫王冲";
//把信息转化为NSData
NSData *infoData = [info dataUsingEncoding:NSUTF8StringEncoding];
//滤镜对象kvc存值
[filter setValue:infoData forKeyPath:@"inputMessage"];
//我们可以打印,看过滤器的 输入属性.这样我们才知道给谁赋值
 NSLog(@"%@",qrImageFilter.inputKeys);
 /*
    inputMessage,        //二维码输入信息
    inputCorrectionLevel //二维码错误的等级,就是容错率
  */
  • 5.生成二维码(前提建立一个UIIMageView对象存放图片),但是图片 发现有的小 (27,27),我们需要放大


CIImage *outImage = [filter outputImage];
  • (1).不处理的情况下生成的二维码(其实生成的二维码是小的,目前是被放大了)
  • imageView.image = [UIImage imageWithCIImage:outImage];//不处理图片模糊,故而调用下面的信息

(2).处理过的图片(需要调用一个方法来处理图片)

imageView.image = [self createNonInterpolatedUIImageFormCIImage:outImage withSize:300];
/**
 *  根据CIImage生成指定大小的UIImage
 *
 *  @param image CIImage
 *  @param size  图片宽度以及高度
 */
- (UIImage *)createNonInterpolatedUIImageFormCIImage:(CIImage *)image withSize:(CGFloat) size
{
  CGRect extent = CGRectIntegral(image.extent);
  CGFloat scale = MIN(size/CGRectGetWidth(extent), size/CGRectGetHeight(extent));
  //1.创建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);
  //2.保存bitmap到图片
  CGImageRef scaledImage = CGBitmapContextCreateImage(bitmapRef);
  CGContextRelease(bitmapRef);
  CGImageRelease(bitmapImage);
  return [UIImage imageWithCGImage:scaledImage];
}


生成的二维码


iOS生成二维码code 密码: bt8f

iOS二维码生成方法封装过的code 密码: 3vqj

重点:在此我进行了对二维码的改善:效果如下


你需要做的是:(已经封装好了)

1.导入:SDWebImage 框架
 2.拖入我封装好的类 ,导入 #import "LogoQR.h"
 3.创建UIImageView的对象来放二维码
 4.调用方法
  /**
 *  [LogoQR new] 调用方法的对象
 *  QRurl :头像的链接
 *  messages: 二维码里面存放的信息
 */
UIImageView的对象.image = [[LogoQR new] QRurl:urlString
                             messages:self.messages];

带logo的二维码  密码: q6s6

三.二维码的扫描

  • 二维码扫描就是将二维码的图像读取,并且解析成我们可以是别的信息
  • 扫描二维码的步骤

(1).读取二维码需要导入AVFoundation框架

(2).利用摄像头读取信息,并且输入

<1>.获取捕捉会话(AVFoundation框架)
 <2>.设置输入摄像头
 <3>.设置输出数据
 <4>.添加预览图层
 <5>.开始扫描二维码
  • 1.导入框架  #import <AVFoundation/AVFoundation.h>
  • 2.获取捕捉会话


AVCaptureSession *session = [[AVCaptureSession alloc]init];
self.session = session;
  • 3.设置输入(摄像头)


//AVMediaTypeVideo:摄像头, AVMediaTypeAudio:话筒, AVMediaTypeMuxed:弹幕
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
if (error) {
  //防止模拟器崩溃
  NSLog(@"没有摄像头设备");
  return;
}
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
[session addInput:input];
  • 4.设置输出(数据) 挂代理


<AVCaptureMetadataOutputObjectsDelegate> 挂代理 
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc]init];
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
[session addOutput:output];
//设置输出类型,必须在output 加入到会话之后来设置
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
  • 5.添加预览层


AVCaptureVideoPreviewLayer *layer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:session];
layer.frame = self.view.bounds;
[self.view.layer addSublayer:layer];
self.layer = layer;
  • 6.开始扫描


[session startRunning];
  • 7.调用扫面结果的代理方法

-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
  if (metadataObjects.count>0)
   {
      //1.获取到扫描的内容
      AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject];
      NSLog(@"扫描的内容==%@",object.stringValue);
      //2.停止会话
      [self.session stopRunning];
      //3.移除预览图层
      [self.layer removeFromSuperlayer];
    }
}


比较好的二维码扫描

也挺详细的;


说明:扫描的内容是什么是可以打印出来的,如果是链接,你可以用WebView来加载的


目录
相关文章
|
缓存 iOS开发 Perl
iOS蓝牙打印小票(打印发票二维码的指令)
iOS蓝牙打印小票(打印发票二维码的指令)
520 0
iOS蓝牙打印小票(打印发票二维码的指令)
|
iOS开发
iOS - QRCode 二维码
1、QRCode 在 iOS7 以前,在 iOS 中实现二维码和条形码扫描,我们所知的有,两大开源组件 ZBar 与 ZXing。iOS7 之后可以利用系统原生 API 生成二维码, iOS8 之后可以生成条形码, 系统默认生成的颜色是黑色。
2519 0
|
移动开发 Android开发 iOS开发
iOS WebView长按网页里的图片识别图片中的二维码和保存图片
iOS WebView长按网页里的图片识别图片中的二维码和保存图片
iOS WebView长按网页里的图片识别图片中的二维码和保存图片
|
iOS开发
IOS创建二维码
IOS创建二维码
64 0
|
编译器 Android开发 iOS开发
iOS应用程序打包ipa转化为二维码
iOS应用程序打包ipa转化为二维码
745 0
iOS应用程序打包ipa转化为二维码
|
开发工具 iOS开发
IOS 使用 ZbarSDK 二维码扫描
IOS 使用 ZbarSDK 二维码扫描
192 0
IOS 使用 ZbarSDK 二维码扫描
|
iOS开发
iOS开发之扫描二维码
自iOS7以后,iOS扫描二维码不需要借助于第三方框架了,苹果在AVFoundation中原生支持了扫描二维码的API,主要涉及到5个类,这5个类在自定义相机或者视频时也用得上,网上有很多介绍,这5个类分别为: AVCaptureSession:媒体捕获会话,负责把捕获的音视频数据输出到输出设备中。
1146 0