iOS 使用CIDetector掃描相冊(cè)二維碼、原生掃描

前言

早上使用微信的時(shí)候豺瘤,突然想到以前在項(xiàng)目中集成掃碼功能吆倦,當(dāng)時(shí)沒有從相冊(cè)中掃描二維碼的需求,加上需要向下兼容坐求,于是選擇集成了zbar掃描蚕泽。今天我們就來看一下如何實(shí)現(xiàn)從相冊(cè)中掃碼、以及原生掃描。

原生掃描

  • iOS7之后须妻,AVFoundation讓我們終于可以使用原生掃描進(jìn)行掃碼了(二維碼與條碼皆可)AVFoundation可以讓我們從設(shè)備中獲取到輸入流與輸出流仔蝌,從而獲取二維碼中包含的信息。

  • 實(shí)現(xiàn)原生掃描非常簡(jiǎn)單荒吏。
    1.先導(dǎo)入AVFoundation框架敛惊。
    <AVFoundation/AVFoundation.h>
    2.接著設(shè)置代理,實(shí)現(xiàn)代理回調(diào)方法
    AVCaptureMetadataOutputObjectsDelegate
    3.然后創(chuàng)建幾個(gè)類即可:
    設(shè)備 AVCaptureDevice
    捕捉會(huì)話 AVCaptureSession
    輸入流 AVCaptureDeviceInput
    輸出流 AVCaptureMetadataOutput
    預(yù)覽圖層 AVCaptureVideoPreviewLayer

  • 下面是簡(jiǎn)單的代碼實(shí)現(xiàn)示例

    NSError *error = nil;
    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];//設(shè)備
    AVCaptureSession *session = [[AVCaptureSession alloc] init];//捕捉會(huì)話
    [session setSessionPreset:AVCaptureSessionPresetHigh];//設(shè)置采集率
    AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];//輸入流
    AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];//輸出流
    //添加到捕捉會(huì)話
    [session addInput:input];
    [session addOutput:output];
    //掃碼類型:需要先將輸出流添加到捕捉會(huì)話后再進(jìn)行設(shè)置
    //這里只設(shè)置了可掃描二維碼,有條碼需要绰更,在數(shù)組中繼續(xù)添加即可
    [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
    //輸出流delegate,在主線程刷新UI
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    AVCaptureVideoPreviewLayer *videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];//預(yù)覽
    videoPreviewLayer.frame = self.view.bounds;
    [self.view.layer insertSublayer:videoPreviewLayer atIndex:0];//添加預(yù)覽圖層
    //還可以設(shè)置掃描范圍 output.rectOfInterest  不設(shè)置默認(rèn)為全屏
    //開始掃描
    [session startRunning];```

* 接著實(shí)現(xiàn)掃碼成功的回調(diào)方法 
  • (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
    NSString *content = @"";
    AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;
    content = metadataObject.stringValue;//獲取到二維碼中的信息字符串
    //對(duì)此字符串進(jìn)行處理(音效瞧挤、網(wǎng)址分析、頁(yè)面跳轉(zhuǎn)等)
    }```
  • 我們還可以添加掃碼成功后的聲音與振動(dòng)效果儡湾,提高用戶體驗(yàn)
  - (void)playBeep{
    SystemSoundID soundID;
    AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"滴-2"ofType:@"mp3"]], &soundID);
    AudioServicesPlaySystemSound(soundID);
    AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);
}

從相冊(cè)獲取二維碼

  • iOS8之后特恬,可以使用CIDetector(CIDetector可用于人臉識(shí)別)進(jìn)行圖片解析,從而使我們可以便捷的從相冊(cè)中獲取到二維碼徐钠。
  • 1.調(diào)用系統(tǒng)相冊(cè)癌刽,從系統(tǒng)相冊(cè)中選取圖片
    2.使用探測(cè)器(CIDetector)對(duì)選取的圖片進(jìn)行處理,取得圖片二維碼中包含的數(shù)據(jù)信息尝丐。
  • 下面是簡(jiǎn)單的代碼實(shí)現(xiàn)示例
  - (void)choicePhoto{
    //調(diào)用相冊(cè)
    UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];
    imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    imagePicker.delegate = self;
    [self presentViewController:imagePicker animated:YES completion:nil];
}
//選中圖片的回調(diào)
-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    NSString *content = @"" ;
    //取出選中的圖片
    UIImage *pickImage = info[UIImagePickerControllerOriginalImage];
    NSData *imageData = UIImagePNGRepresentation(pickImage);
    CIImage *ciImage = [CIImage imageWithData:imageData];
    
    //創(chuàng)建探測(cè)器
    CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyLow}];
    NSArray *feature = [detector featuresInImage:ciImage];
    
    //取出探測(cè)到的數(shù)據(jù)
    for (CIQRCodeFeature *result in feature) {
        content = result.messageString;
    }
    //進(jìn)行處理(音效妒穴、網(wǎng)址分析、頁(yè)面跳轉(zhuǎn)等)
}

源碼

點(diǎn)此下載:github源碼

結(jié)語(yǔ)

原生掃描比zbar摊崭、zxing效率更高讼油,且這兩個(gè)庫(kù)年久失修(zxingOBJC有人在持續(xù)維護(hù))還有兼容性問題。
CIDetector是系統(tǒng)為我們提供的非常強(qiáng)大的類庫(kù)呢簸,但是很多公司因?yàn)樾枰蛳录嫒莅ǎ詻]有辦法使用。
如果項(xiàng)目不需向下兼容多個(gè)版本時(shí)根时,建議使用系統(tǒng)原生掃描以及CIDetector進(jìn)行二維碼相關(guān)處理瘦赫。

參考:
http://www.tuicool.com/articles/ie2aAjv
http://www.reibang.com/p/cc79c45b4ccf

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蛤迎,隨后出現(xiàn)的幾起案子确虱,更是在濱河造成了極大的恐慌,老刑警劉巖替裆,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件校辩,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡辆童,警方通過查閱死者的電腦和手機(jī)宜咒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來把鉴,“玉大人故黑,你說我怎么就攤上這事。” “怎么了场晶?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵混埠,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我诗轻,道長(zhǎng)岔冀,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任概耻,我火速辦了婚禮,結(jié)果婚禮上罐呼,老公的妹妹穿的比我還像新娘鞠柄。我一直安慰自己,他們只是感情好嫉柴,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布厌杜。 她就那樣靜靜地躺著,像睡著了一般计螺。 火紅的嫁衣襯著肌膚如雪夯尽。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天登馒,我揣著相機(jī)與錄音匙握,去河邊找鬼。 笑死陈轿,一個(gè)胖子當(dāng)著我的面吹牛圈纺,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播麦射,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蛾娶,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了潜秋?” 一聲冷哼從身側(cè)響起蛔琅,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎峻呛,沒想到半個(gè)月后罗售,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钩述,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年莽囤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片切距。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朽缎,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情话肖,我是刑警寧澤北秽,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布,位于F島的核電站最筒,受9級(jí)特大地震影響贺氓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜床蜘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一辙培、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧邢锯,春花似錦扬蕊、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至蒂培,卻和暖如春再愈,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背护戳。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工翎冲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人媳荒。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓府适,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親肺樟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子檐春,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

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