華山論劍之iOS 的二維碼生成和掃描

對(duì)于iOS二維碼的生成和掃描,也算的上老生常談的問題了,但是為了自己以后找這一方面的資料的時(shí)候能夠方便,所以寫一篇iOS二維碼的生成和掃描的文章.


二維碼的生成


對(duì)于生成二維碼 ,我們主要用到的是CIFilter先轉(zhuǎn)化為CIImage , 再添加到imageView上面去.

首先 我使用的XIB ,我們需要把CIFilter實(shí)例化

    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];

然后就是傳入對(duì)應(yīng)的數(shù)據(jù)生成對(duì)應(yīng)的二維碼

//恢復(fù)濾鏡的默認(rèn)屬性(因?yàn)闉V鏡有可能保存上一次的屬性)
    [filter setDefaults];
    //經(jīng)字符串轉(zhuǎn)化成NSData
    NSData *data = [self.textField.text dataUsingEncoding:NSUTF8StringEncoding];
    //傳入data竹揍,將來濾鏡就知道要通過傳入的數(shù)據(jù)生成二維碼
    [filter setValue:data forKey:@"inputMessage"];
    //生成二維碼
    CIImage *image = [filter outputImage];
    //CIImage是CoreImage框架中最基本代表圖像的對(duì)象,他不僅包含元圖像數(shù)據(jù)甫男,還包含作用在原圖像上的濾鏡鏈一汽。
    UIImage *image1 = [UIImage imageWithCIImage:image];
    //注:像這樣將CIImage直接轉(zhuǎn)換成UIImage生成的二維碼會(huì)比較模糊识脆,但是簡(jiǎn)單梯浪,也可以掃描出信息封豪。

然后就是把我們的二維碼展示到我們的imageView上就可以了.

    self.imgView.image = image1;

因?yàn)槭怯脁ib做的,所以可能上面有些看不懂,下面就是在ViewController完整的代碼

//
//  ViewController.m
//  iOS二維碼生成
//
//  Created by songjc on 16/5/2.
//  Copyright ? 2016年 Don9. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@property (strong, nonatomic) IBOutlet UITextField *textField;//輸入信息的Field


@property (strong, nonatomic) IBOutlet UIImageView *imgView;//生成的二維碼顯示的View


@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}


- (IBAction)generateAction:(id)sender {
    
    [self.textField resignFirstResponder];
    CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
    
    
    //恢復(fù)濾鏡的默認(rèn)屬性(因?yàn)闉V鏡有可能保存上一次的屬性)
    [filter setDefaults];
    //經(jīng)字符串轉(zhuǎn)化成NSData
    NSData *data = [self.textField.text dataUsingEncoding:NSUTF8StringEncoding];
    //4.傳入data抖剿,將來濾鏡就知道要通過傳入的數(shù)據(jù)生成二維碼
    [filter setValue:data forKey:@"inputMessage"];
    //生成二維碼
    CIImage *image = [filter outputImage];
    //CIImage是CoreImage框架中最基本代表圖像的對(duì)象朽寞,他不僅包含元圖像數(shù)據(jù),還包含作用在原圖像上的濾鏡鏈斩郎。
    UIImage *image1 = [UIImage imageWithCIImage:image];
    //注:像這樣將CIImage直接轉(zhuǎn)換成UIImage生成的二維碼會(huì)比較模糊脑融,但是簡(jiǎn)單,也可以掃描出信息缩宜。
    
    //設(shè)置生成好的二維碼到imageVIew上
    self.imgView.image = image1;
    
    
}

@end


二維碼的掃描


二維碼掃描這一塊我們先導(dǎo)入兩個(gè)庫.

CoreImage.framework
AVFoundation.framework

對(duì)于二維碼的掃描代碼部分也是比較簡(jiǎn)單的,思路就是我們首先調(diào)用我們的相機(jī),然后掃描我們的二維碼通過實(shí)現(xiàn)AVCaptureMetadataOutputObjectsDelegate的代理方法在代理方法- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection中獲取到二維碼中的信息.然后加以處理.

注意:因?yàn)樾枰{(diào)用攝像頭,所以必須是真機(jī)測(cè)試,我在這里就不做模擬器的代碼保護(hù)了

代碼如下,因?yàn)樽⑨尪技拥奶敿?xì)了,我都不忍直視了??

//
//  ViewController.m
//  二維碼掃描
//
//  Created by songjc on 16/4/18.
//  Copyright ? 2016年 Don9. All rights reserved.
//

#import "ViewController.h"

#import <AVFoundation/AVFoundation.h>
#import <CoreImage/CoreImage.h>

@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>

//捕獲會(huì)話
@property (nonatomic,strong) AVCaptureSession *session;

//預(yù)覽圖層肘迎,可以通過輸出設(shè)備展示被捕獲的數(shù)據(jù)流。
@property (nonatomic,strong) AVCaptureVideoPreviewLayer *previewLayer;

@property (weak, nonatomic) IBOutlet UILabel *label;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (IBAction)scan:(UIButton *)sender {
    //1.實(shí)例化拍攝設(shè)備
    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; //媒體類型
    
    //2.設(shè)置輸入設(shè)備
    NSError *error = nil;
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
    if (error) {
        //防止模擬器崩潰
        NSLog(@"沒有攝像頭設(shè)備");
        return;
    }
    
    //3.設(shè)置元數(shù)據(jù)輸出
    //實(shí)例化拍攝元數(shù)據(jù)輸出
    AVCaptureMetadataOutput *output=[[AVCaptureMetadataOutput alloc]init];
    //設(shè)置輸出數(shù)據(jù)代理
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    
    //4.添加拍攝會(huì)話
    //實(shí)例化拍攝會(huì)話
    AVCaptureSession *session =[[AVCaptureSession alloc]init];
    [session setSessionPreset:AVCaptureSessionPresetHigh];//預(yù)設(shè)輸出質(zhì)量
    //添加會(huì)話輸入
    [session addInput:input];
    //添加會(huì)話輸出
    [session addOutput:output];
    //添加會(huì)話輸出條碼類型
    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    self.session = session;
    
    //5.視頻預(yù)覽圖層
    //實(shí)例化預(yù)覽圖層
    AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];
    preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
    preview.frame = CGRectMake(100, 100, 100, 100);
    //將圖層插入當(dāng)前視圖
    [self.view.layer insertSublayer:preview atIndex:100];
    self.previewLayer = preview;
    
    //6.啟動(dòng)會(huì)話
    [_session startRunning];
}


//獲得的數(shù)據(jù)在此方法中
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{
    // 會(huì)頻繁的掃描锻煌,調(diào)用代理方法
    // 1. 如果掃描完成妓布,停止會(huì)話
    [self.session stopRunning];
    // 2. 刪除預(yù)覽圖層
    [self.previewLayer removeFromSuperlayer];
    // 3. 設(shè)置界面顯示掃描結(jié)果
    //判斷是否有數(shù)據(jù)
    if (metadataObjects.count > 0) {
        AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
        //如果需要對(duì)url或者名片等信息進(jìn)行掃描,可以在此進(jìn)行擴(kuò)展
        self.label.text = obj.stringValue;
    }
    //結(jié)束掃描
    [self dismissViewControllerAnimated:YES completion:^{
        UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:self.label.text preferredStyle:UIAlertControllerStyleAlert];
        UIAlertAction *action = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
        [alert addAction:action];
        [self presentViewController:alert animated:YES completion:nil];
    }];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end


總結(jié): iOS原生二維碼的掃描和生成比較簡(jiǎn)單.但是用到的地方不少,希望這篇文章對(duì)大家有所幫助.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末宋梧,一起剝皮案震驚了整個(gè)濱河市匣沼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捂龄,老刑警劉巖释涛,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異倦沧,居然都是意外死亡唇撬,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門展融,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窖认,“玉大人,你說我怎么就攤上這事∫” “怎么了轮傍?”我有些...
    開封第一講書人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)首装。 經(jīng)常有香客問我创夜,道長(zhǎng),這世上最難降的妖魔是什么仙逻? 我笑而不...
    開封第一講書人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任驰吓,我火速辦了婚禮,結(jié)果婚禮上系奉,老公的妹妹穿的比我還像新娘檬贰。我一直安慰自己,他們只是感情好缺亮,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開白布翁涤。 她就那樣靜靜地躺著,像睡著了一般萌踱。 火紅的嫁衣襯著肌膚如雪葵礼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評(píng)論 1 291
  • 那天并鸵,我揣著相機(jī)與錄音鸳粉,去河邊找鬼。 笑死园担,一個(gè)胖子當(dāng)著我的面吹牛届谈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播弯汰,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼艰山,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蝙泼?” 一聲冷哼從身側(cè)響起程剥,我...
    開封第一講書人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎汤踏,沒想到半個(gè)月后织鲸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡溪胶,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年搂擦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哗脖。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡瀑踢,死狀恐怖扳还,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情橱夭,我是刑警寧澤氨距,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站棘劣,受9級(jí)特大地震影響俏让,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茬暇,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一首昔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧糙俗,春花似錦勒奇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至劈彪,卻和暖如春巨税,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背粉臊。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留驶兜,地道東北人扼仲。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像抄淑,于是被迫代替她去往敵國(guó)和親屠凶。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

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

  • 序言 前面我們已經(jīng)調(diào)到過怎么制作二維碼肆资,在我們能夠生成二維碼之后矗愧,如何對(duì)二維碼進(jìn)行掃描呢? 在iOS7之前郑原,大部分...
    sindri的小巢閱讀 31,476評(píng)論 44 112
  • 一唉韭、掃描 1、 ZBar ZBar在掃描的靈敏度上犯犁,和內(nèi)存的使用上相對(duì)于ZXing上都是較優(yōu)的属愤,但是對(duì)于 “圓角二...
    空白Null閱讀 1,048評(píng)論 0 2
  • github排名https://github.com/trending,github搜索:https://gith...
    小米君的demo閱讀 4,564評(píng)論 2 38
  • 今天,媽媽拿回來一些大螃蟹酸役,它們非常強(qiáng)壯住诸,力氣也很大驾胆。為什么這么說呢,下面我用我的親身經(jīng)歷來告訴你贱呐。 ...
    席振桓閱讀 251評(píng)論 0 1
  • 第一天丧诺,寫了很多 不知不覺已經(jīng)到了第二天,但還是想有一個(gè)好的開始奄薇。 今天驳阎,暫且把昨天算是今天吧。 遠(yuǎn)程裝了ps惕艳,查...
    蒸蛋x閱讀 118評(píng)論 0 0