iOS二維碼

一、介紹

iOS7之后,蘋果API中集成了二維碼的生成和讀取功能。
框架:CoreImage
二維碼的內(nèi)容:純文本,名片,URL

二、生成二維碼

// 1.創(chuàng)建生成二維碼的濾鏡
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
// 2.把數(shù)據(jù)輸入給濾鏡
NSString *url = @"http://www.baidu.com";
NSData *data = [url dataUsingEncoding:NSUTF8StringEncoding];
//需要把NSString 轉(zhuǎn)為 NSData
[filter setValue:data forKeyPath:@"inputMessage"];
// 3.獲得濾鏡生成的二維碼
CIImage *image = [filter outputImage];
// 4.為圖片設(shè)置image
self.imageView.image = [UIImage imageWithCIImage:image];

三、參數(shù)細(xì)節(jié)

1.創(chuàng)建濾鏡的參數(shù)獲得方式
//創(chuàng)建濾鏡的參數(shù)的獲得方式
NSArray *array = [CIFilter filterNamesInCategories:@[kCICategoryBuiltIn]];
NSLog(@"%@",array);
2.設(shè)置濾鏡參數(shù)的KeyPath獲得方式
NSLog(@"%@",[filter inputKeys]);

四、二維碼中間添加圖片

- (UIImage *)lufyImageWithImage:(UIImage *)image withHeadImage:(UIImage *)headImage{
  //1.開啟上下文
  UIGraphicsBeginImageContext(image.size);
  //2.繪制二維碼圖
  [image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];
  //3.繪制頭像 - 頭像的大小不能超過(guò)二維碼的30%
  CGFloat imageX = (image.size.width - headImage.size.width) * 0.5;
  CGFloat imageY = (image.size.height - headImage.size.height) * 0.5;;
  CGFloat imageW = image.size.width * 0.3;
  CGFloat imageH = image.size.height * 0.3;
  [headImage drawInRect:CGRectMake(imageX, imageY, imageW, imageH)];
  //4.取出圖片
  UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
  //5.關(guān)閉上下文
  UIGraphicsEndImageContext();
  return newImage;
}

五、二維碼掃描

//開啟二維碼掃描
- (void)startCode{
  // 1. 輸入設(shè)備-攝像頭
  AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
  AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
  // 2. 會(huì)話(溝通輸入-輸出)
  self.session = [[AVCaptureSession alloc] init];
  // 2.1添加輸入
  if ([self.session canAddInput:input]) {
    [self.session addInput:input];
  }
  // 2.2 預(yù)覽圖層 -- 可以自定義一個(gè)UIView來(lái)做自己想要的界面
  AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
  // 注意: 必須設(shè)置layer的frame值
  layer.frame = self.view.bounds;
  [self.view.layer addSublayer:layer];
  // 3. 輸出
  AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
  // 3.1 配置代理和線程
  [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
  // 3.2 將輸出添加到session
  if ([self.session canAddOutput:output]) {
    [self.session addOutput:output];
  }
  // 3.3 設(shè)置解析的數(shù)據(jù)類型--二維碼
  [output setMetadataObjectTypes:@[@"org.iso.QRCode"]];
  // 3.4設(shè)置有效掃描范圍,rectOfInterest的值是0.0-1.0.
  output.rectOfInterest = [self rectWithRect:self.view.bounds];
  // 4.開始掃描, 會(huì)一直不斷的掃描
  [_session startRunning];
}

//計(jì)算有效掃描范圍
- (CGRect)rectWithRect:(CGRect)screenRect{
  // 在正中間添加一個(gè) 200 * 200 的效區(qū)域
  CGFloat x = ((screenRect.size.width - 200) * 0.5) / screenRect.size.width;
  CGFloat y = ((screenRect.size.height - 200) * 0.5) / screenRect.size.height;
  CGFloat width = 200 / screenRect.size.width;
  CGFloat height = 200 / screenRect.size.height;
  return CGRectMake(y, x, height, width);
}

//二維碼掃描代理
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
  AVMetadataMachineReadableCodeObject *codeObject = metadataObjects.lastObject;
  NSString *content = codeObject.stringValue;
  NSLog(@"%@", content);
  // 停止掃描
  [_session stopRunning];
}

六、輸出設(shè)備的解析類型查詢方式

注意: 只有真機(jī)能查看到相應(yīng)的type值, 查看可用類型
NSArray *metadataTypes = [output availableMetadataObjectTypes];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 二維碼是用特定的幾何圖形來(lái)記錄信息 在之前,常用的二維碼開發(fā)框架有:ZXing和ZBarSDK 蘋果從iOS7開始...
    IIronMan閱讀 11,676評(píng)論 0 27
  • 以前對(duì)iOS關(guān)于二維碼方面的知識(shí)掌握的比較零碎, 直到自己的一個(gè)關(guān)于支付方面iOS項(xiàng)目中有二維碼掃描界面、二維碼生...
    獻(xiàn)國(guó)閱讀 1,131評(píng)論 0 2
  • 前面我們介紹了二維碼的生成,現(xiàn)在我們介紹一下怎么掃描二維碼;在iOS7之前,大部分應(yīng)用中使用的二維碼掃描是ZXin...
    杰森_Jason閱讀 1,806評(píng)論 3 2
  • 以前就寫過(guò)二維碼掃描的文章,今天難得抽出來(lái)時(shí)間重新整理了一下,把所有用都的關(guān)于二維碼的都寫在這了,二維碼問(wèn)題,看了...
    WWest閱讀 50,705評(píng)論 94 287
  • 一、掃描 1、 ZBar ZBar在掃描的靈敏度上,和內(nèi)存的使用上相對(duì)于ZXing上都是較優(yōu)的,但是對(duì)于 “圓角二...
    空白Null閱讀 1,143評(píng)論 0 2

友情鏈接更多精彩內(nèi)容