iOS - AVFoundation - 二維碼

在以前二維碼比較知名的框架是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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寻仗,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子凡壤,更是在濱河造成了極大的恐慌署尤,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亚侠,死亡現(xiàn)場離奇詭異曹体,居然都是意外死亡,警方通過查閱死者的電腦和手機硝烂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門箕别,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事串稀〕祝” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵母截,是天一觀的道長到忽。 經(jīng)常有香客問我,道長清寇,這世上最難降的妖魔是什么喘漏? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮华烟,結(jié)果婚禮上陷遮,老公的妹妹穿的比我還像新娘。我一直安慰自己垦江,他們只是感情好帽馋,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著比吭,像睡著了一般绽族。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上衩藤,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天吧慢,我揣著相機與錄音,去河邊找鬼赏表。 笑死检诗,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的瓢剿。 我是一名探鬼主播逢慌,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼间狂!你這毒婦竟也來了攻泼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤鉴象,失蹤者是張志新(化名)和其女友劉穎忙菠,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺弊,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡牛欢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了淆游。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傍睹。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡隔盛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出焰望,到底是詐尸還是另有隱情骚亿,我是刑警寧澤已亥,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布熊赖,位于F島的核電站,受9級特大地震影響虑椎,放射性物質(zhì)發(fā)生泄漏震鹉。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一捆姜、第九天 我趴在偏房一處隱蔽的房頂上張望传趾。 院中可真熱鬧,春花似錦泥技、人聲如沸浆兰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽簸呈。三九已至,卻和暖如春店茶,著一層夾襖步出監(jiān)牢的瞬間蜕便,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工贩幻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轿腺,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓丛楚,卻偏偏與公主長得像族壳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子趣些,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容