在以前二維碼比較知名的框架是ZXing和Zbar,現(xiàn)在,iOS系統(tǒng)提供了原生的實現(xiàn)二維碼的功能
內(nèi)容:
- 二維碼的掃描(通過攝像頭掃描)
- 二維碼的生成
- 二維碼的讀取(通過圖片識別)
二維碼的掃描
二維碼掃描使用的是AVFoundation镐作,通過調(diào)用攝像頭掃描,實現(xiàn)代理方法獲取掃描后的數(shù)據(jù)
步驟:
1.輸入設(shè)備 : 指定輸入設(shè)備隆箩,如攝像頭该贾,麥克風(fēng)等
2.輸出設(shè)備 : 解析數(shù)據(jù)
3.會話(session):連接輸入和輸出設(shè)備
4.圖層顯示(layer):顯示到屏幕上
示例代碼:
// ViewController.m
// QRCoder
//
// Created by yangguangyu on 16/8/18.
// Copyright ? 2016年 yangguangyu. All rights reserved.
//
#import "ViewController.h"
#import <AVFoundation/AVFoundation.h>
@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>
@property (nonatomic, strong) AVCaptureDevice *device;
@property (nonatomic, strong) AVCaptureDeviceInput *input;
@property (nonatomic, strong) AVCaptureMetadataOutput *output;
@property (nonatomic, strong) AVCaptureSession *session;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
//1.輸入設(shè)備
//指定是視頻輸入設(shè)備
self.device = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo].firstObject;
self.input = [[AVCaptureDeviceInput alloc] initWithDevice:self.device error:NULL];
//2.輸出設(shè)備 -- 用來解析數(shù)據(jù)
/*
AVCaptureMetadataOutput //元數(shù)據(jù)(查的字典),應(yīng)該就是沒有進過處理的數(shù)據(jù)
AVCaptureFileOutput //把數(shù)據(jù)當(dāng)做文件來處理
AVCaptureMovieFileOutput //把數(shù)據(jù)當(dāng)做視頻文件來處理
AVCaptureVideoDataOutput //把數(shù)據(jù)當(dāng)做視頻的data處理
AVCaptureAudioDataOutput //把數(shù)據(jù)當(dāng)做音頻的data處理
AVCaptureStillImageOutput //把數(shù)據(jù)當(dāng)做靜態(tài)圖片處理處理 -- layer顯示的時候就會是圖片捌臊,不再是視頻了
*/
//指定是視頻文件輸出
self.output = [[AVCaptureMetadataOutput alloc] init];
// NSLog(@"%@",self.output.availableMetadataObjectTypes);
// self.output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];//安裝QRCode(二維碼)來識別
//3.會話
self.session = [[AVCaptureSession alloc] init];
//連接輸入設(shè)備
if ([self.session canAddInput:self.input]) {
[self.session addInput:self.input];
}
//連接輸出設(shè)備
if ([self.session canAddOutput:self.output]) {
[self.session addOutput:self.output];
}
self.output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode];
//設(shè)置代理杨蛋,監(jiān)聽輸出的數(shù)據(jù)
[self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
//4.預(yù)覽圖層
AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
layer.frame = [UIScreen mainScreen].bounds;
[self.view.layer addSublayer:layer];
[self.session startRunning];
}
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
if ([self.session isRunning]) {
[self.session stopRunning];
}else {
[self.session startRunning];
}
}
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
//這里調(diào)用的比較頻繁,而且還會存在空的情況
if (metadataObjects.count == 0) {
return;
}
for (id obj in metadataObjects) {
NSLog(@"%@",[obj class]);
NSLog(@"%@",obj);
[self.session stopRunning];
}
}
@end
注意
設(shè)置metadataObjectTypes需要在添加output之后才可以理澎,否則的話提示-[AVCaptureMetadataOutput setMetadataObjectTypes:] - unsupported type found. Use -availableMetadataObjectTypes.'
通過打印availableMetadataObjectTypes
也可以發(fā)現(xiàn)逞力,如果是在添加到session之前的話,打印出來的是一個空數(shù)組糠爬。
二維碼的生成
二維碼的生成需要使用CoreImage寇荧,這個包含在UIKit中
簡單示例:
//
// ViewController.m
// QRcode生成
//
// Created by yangguangyu on 16/8/19.
// Copyright ? 2016年 yangguangyu. All rights reserved.
//
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong) UIImageView *qrCodeImage;
@end
@implementation ViewController
-(UIImageView *)qrCodeImage {
if (!_qrCodeImage) {
_qrCodeImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
_qrCodeImage.center = self.view.center;
}
return _qrCodeImage;
}
- (void)viewDidLoad {
[super viewDidLoad];
//1.創(chuàng)建filter(過濾器)
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
//2.設(shè)置默認值
[filter setDefaults];
//3.設(shè)置輸入內(nèi)容
NSString *text = @"UIKit框架";
NSData *data = [text dataUsingEncoding:NSUTF8StringEncoding];
[filter setValue:data forKey:@"inputMessage"];
//4.取出生成的圖片
CIImage *ciimage = filter.outputImage;
//5.放大圖片比例(取出的圖片很小需要放大,否則圖片很模糊)
ciimage = [ciimage imageByApplyingTransform:CGAffineTransformMakeScale(8, 8)];
self.qrCodeImage.image = [UIImage imageWithCIImage:ciimage];
[self.view addSubview:self.qrCodeImage];
}
@end
一般的二維碼這樣就可以了执隧,有一些可能會需要彩色的二維碼砚亭,或者是需要填充一張公司的logo在二維碼的中心。自己簡單封裝了一下殴玛,有需要的可以下載一下QRcodeDemo
二維碼的讀取
偷個懶捅膘,直接copy的里脊竄大大的
讀取主要用到CoreImage 不過要強調(diào)的是讀取二維碼的功能只有在iOS8之后才支持
UIImage * srcImage = qrcodeImage;
CIContext *context = [CIContext contextWithOptions:nil];
CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:context options:@{CIDetectorAccuracy:CIDetectorAccuracyHigh}];
CIImage *image = [CIImage imageWithCGImage:srcImage.CGImage];
NSArray *features = [detector featuresInImage:image];
CIQRCodeFeature *feature = [features firstObject];
NSString *result = feature.messageString;
框架推薦:
LBXScan功能比較全面,如果自己不想研究二維碼這塊滚粟,完全可以使用這個框架
參考:
再見ZXing 使用系統(tǒng)原生代碼處理QRCode