1. 程式人生 > >使用系統的AVMetadataObject類實現二維碼掃描

使用系統的AVMetadataObject類實現二維碼掃描

前言

有關二維碼的介紹,我這裡不做過多說明, 可以直接去基維百科檢視,附上鍊接QR code.
IOS7之前,開發者進行掃碼程式設計時,一般會藉助第三方庫。常用的是ZBarSDKaZXingObjC,IOS7之後,系統的AVMetadataObject類中,為我們提供瞭解析二維碼的介面。經過測試,使用原生API掃描和處理的效率非常高,遠遠高於第三方庫。

掃描

官方提供的介面非常簡單,直接看程式碼,主要使用的是AVFoundation。

@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>//用於處理採集資訊的代理
{
    AVCaptureSession * session;//輸入輸出的中間橋樑
}
@end
@implementation ViewController
 
- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //獲取攝像裝置
    AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    //建立輸入流
    AVCaptureDeviceInput * input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
    if (!input) return;
    //建立輸出流
    AVCaptureMetadataOutput * output = [[AVCaptureMetadataOutput alloc]init];
    //設定代理 在主執行緒裡重新整理
    [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
    //設定有效掃描區域
    CGRect scanCrop=[self getScanCrop:_scanWindow.bounds readerViewBounds:self.view.frame];
     output.rectOfInterest = scanCrop;
    //初始化連結物件
    _session = [[AVCaptureSession alloc]init];
    //高質量採集率
    [_session setSessionPreset:AVCaptureSessionPresetHigh];
    
    [_session addInput:input];
    [_session addOutput:output];
    //設定掃碼支援的編碼格式(如下設定條形碼和二維碼相容)
    
[email protected]
[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code]; AVCaptureVideoPreviewLayer * layer = [AVCaptureVideoPreviewLayer layerWithSession:_session]; layer.videoGravity=AVLayerVideoGravityResizeAspectFill; layer.frame=self.view.layer.bounds; [self.view.layer insertSublayer:layer atIndex:0]; //開始捕獲 [_session startRunning]; } -(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if (metadataObjects.count>0) { //[session stopRunning]; AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex : 0 ]; //輸出掃描字串 NSLog(@"%@",metadataObject.stringValue); } }

一些初始化的程式碼加上實現代理方法便完成了二維碼掃描的工作,這裡我們需要注意的是, 在二維碼掃描的時候, 我們一般都會在螢幕中間放一個方框,用來顯示二維碼掃描的大小區間,這裡我們在個AVCaptureMetadataOutput類中有一個rectOfInterest屬性,它的作用就是設定掃描範圍。

這個CGRect引數和普通的Rect範圍不太一樣,它的四個值的範圍都是0-1,表示比例。
rectOfInterest都是按照橫屏來計算的 所以當豎屏的情況下 x軸和y軸要交換一下。
寬度和高度設定的情況也是類似。

我們在上面設定有效掃描區域的方法如下

#pragma mark-> 獲取掃描區域的比例關係
-(CGRect)getScanCrop:(CGRect)rect readerViewBounds:(CGRect)readerViewBounds
{
    
    CGFloat x,y,width,height;
    
    x = (CGRectGetHeight(readerViewBounds)-CGRectGetHeight(rect))/2/CGRectGetHeight(readerViewBounds);
    y = (CGRectGetWidth(readerViewBounds)-CGRectGetWidth(rect))/2/CGRectGetWidth(readerViewBounds);
    width = CGRectGetHeight(rect)/CGRectGetHeight(readerViewBounds);
    height = CGRectGetWidth(rect)/CGRectGetWidth(readerViewBounds);
    
    return CGRectMake(x, y, width, height);
    
}

讀取

讀取主要用到CoreImage 不過要強調的是讀取二維碼的功能只有在iOS8之後才支援,我們需要在相簿中呼叫一個二維碼,將其讀取,程式碼如下

#pragma mark-> 我的相簿
-(void)myAlbum{
    
    NSLog(@"我的相簿");
    if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]){
        //1.初始化相簿拾取器
        UIImagePickerController *controller = [[UIImagePickerController alloc] init];
        //2.設定代理
        controller.delegate = self;
        //3.設定資源:
        /**
         UIImagePickerControllerSourceTypePhotoLibrary,相簿
         UIImagePickerControllerSourceTypeCamera,相機
         UIImagePickerControllerSourceTypeSavedPhotosAlbum,照片庫
         */
        controller.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
        //4.隨便給他一個轉場動畫
        controller.modalTransitionStyle=UIModalTransitionStyleFlipHorizontal;
        [self presentViewController:controller animated:YES completion:NULL];
        
    }else{
        
        UIAlertView * alert = [[UIAlertView alloc]initWithTitle:@"提示" message:@"裝置不支援訪問相簿,請在設定->隱私->照片中進行設定!" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
        [alert show];
    }
    
}

完成相簿代理, 我們在代理中新增讀取二維碼方法

#pragma mark-> imagePickerController delegate
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //1.獲取選擇的圖片
    UIImage *image = info[UIImagePickerControllerOriginalImage];
    //2.初始化一個監測器
    CIDetector*detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{ CIDetectorAccuracy : CIDetectorAccuracyHigh }];
    
    [picker dismissViewControllerAnimated:YES completion:^{
        //監測到的結果陣列
        NSArray *features = [detector featuresInImage:[CIImage imageWithCGImage:image.CGImage]];
        if (features.count >=1) {
            /**結果物件 */
            CIQRCodeFeature *feature = [features objectAtIndex:0];
            NSString *scannedResult = feature.messageString;
            UIAlertView * alertView = [[UIAlertView alloc]initWithTitle:@"掃描結果" message:scannedResult delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
            [alertView show];
          
        }
        else{
            UIAlertView * alertView = [[UIAlertView alloc]initWithTitle:@"提示" message:@"該圖片沒有包含一個二維碼!" delegate:nil cancelButtonTitle:@"確定" otherButtonTitles:nil, nil];
            [alertView show];
            
        }
        
  
    }];
    
    
}

因為沒用真機,所以這裡沒有給出太多的截圖, 用模擬器讀取自帶圖片,結果如下

相關推薦

使用系統AVMetadataObject實現掃描

前言 有關二維碼的介紹,我這裡不做過多說明, 可以直接去基維百科檢視,附上鍊接QR code. IOS7之前,開發者進行掃碼程式設計時,一般會藉助第三方庫。常用的是ZBarSDKa和ZXingObjC,IOS7之後,系統的AVMetadataObject類中,為我們提供

簡單使用系統的裝置實現掃描

這裡我用了系統的東西簡單的實現了一下掃描二維碼 .h #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> @interface saoMiaoViewController :

使用系統提供的AVFoundation 實現掃描(帶動畫)

注意這裡的掃描必須真機測試 模擬器上是看不出來效果的 #import "ViewController.h" #import <AVFoundation/AVFoundation.h> @interface ViewController ()<AVCa

實現掃描

首先app頁面 public class MyApp extends Application{ @Override public void onCreate() { super.onCreate(); ZXingL

Xamarin.Android-用ZXing實現掃描以及連續掃描

一、前言 本文的內容有兩個基礎:ZXing.Net和ZXing.Net.Mobile ZXing.Net:ZXing的C#實現,主要封裝了各種二維碼的編碼、解碼等跨平臺的演算法 ZXing.Net.Mobile:對ZXing.Net在xamarin的應用進行了封裝,主要實現了攝像頭掃描、掃描view、掃

Android實現掃描功能(三)-閃光燈控制

簡介 本篇我們對光線暗淡情況下閃光燈的使用做出介紹。 效果 晚上測試時: 開燈後: 未開燈: 實現步驟 1、在activity_scanner.xml介面上加上閃光燈開關按鈕。可以是Button、Checkbox等控制元件。

Android實現掃描登入網頁

    之前寫過一個二維碼掃描demo,用的Zxing的框架,點選下載,後續掃描二維碼中出現一些問題,比如解決壓縮圖片,調整掃描視窗大小等等。後續單位要求做掃描登入實現,發現難點就是怎麼知道你掃描的是

簡單實現掃描

文章是我轉載的哦,一片楓葉_劉超大神寫的好棒,謝謝分享,原文地址http://blog.csdn.net/qq_23547831/article/details/52037710#reply 本文將講解一下我最近寫的一個快速整合二維碼掃描庫,這裡需要說明的是其核心的實現

Android開發之Zbar實現掃描功能

前言: 在寫這篇文章之前已經寫過兩篇關於二維碼功能的文章,有興趣的可以看看——》文章1:Android開發之利用ZXing庫實現二維碼的掃描;文章2:Android開發之利用ZXing庫實現二維碼的生成,這兩篇文章中使用到的二維碼生成庫是ZXing,在本篇

Android實現掃描功能()-ZXing個性化與近距離識別優化

簡介 本篇我們對掃碼介面進行優化,並對ZXing近距離無法識別的問題做出優化。 個性化定製 每個APP都有自己的表現形式,實現個性化掃碼介面定製,主要有兩個地方: activity_scanner.xml介面檔案 com.google.zxin

Android實現掃描(仿微信,輕量Zxing)

前言 要做一個功能,二維碼識別。網上找一堆相關的Demo,但是總不是想要的效果,或者都是多年前的版本,權衡考慮之後,決定親自操刀。不糾結直接選中Zxing框架,https://github.com/zxing/zxing 在網站上直接clone下來,執行,然後就發現問題了.

React Native實現掃描

依賴包匯入步驟 詳細步驟可看github上的說明,簡要記錄如下: 1. npm install react-native-camera –save 2. react-native link react-native-camera android手動l

使用開原始碼實現掃描和生成

把BarCodeTest導到ADT中,然後建立自己的工程TestQRcode,並關聯BarCodeTest.在TestQRcode工程配置檔案中新增許可權 <uses-permission android:name="android.permis

ios-實現掃描功能

在此就簡單的介紹下二維碼掃描功能的實現把 首先先說下思路,我們需要去配置的就是   1、輸入裝置(用來獲取外界資訊),輸入裝置有攝像頭、麥克風、鍵盤   2、輸出裝置(將收集到的資訊進行解析去獲取收到的內容)   3、會話的session(用來連線輸入和輸出的裝置),不然的

Google zxing實現掃描完美解決方案

最近因專案需求,需要在App中整合二維碼掃描的功能。網上找了很多資料,最後決定使用Google的zxing來實現。實現的過程遇到了很多的坑,也是因為這些坑在網上沒有具體的解決方案,今天就把我的實現過程分享給大家。 我會分為兩步來和大家分享: (1)專案中如何整合zxing

iOS使用ZBar實現掃描以及實現識別相簿中圖片功能

使用zbar呼叫相機掃碼程式碼: //開啟相機 - (void) init_camera { self.navigationController.navigationBarHidden=YES;     [commonaddNavigationAddToView:

web/html5呼叫攝像頭實現掃描

閒話不說,直接上程式碼,本人測試通過! html/js <!DOCTYPE html> <html><head> <title>HTML5 code Reader</title> <meta http-

Android記錄貼:使用ZXing來實現掃描

參考資料 前言 最近一個專案需要用到掃描二維碼的功能,在網上查了一下,都是使用google的ZXing開源庫來實現的 第一步:匯入依賴 匯入依賴包,目前最新的是3.3.2,可以通過這裡來檢視最新版本 implementation 'com.go

Android 基於google Zxing實現 條形碼掃描,仿微信掃描效果

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

使用依賴(ZXing)簡單的實現掃描和生成

一個簡單的佈局 第一步:新增依賴 //二維碼依賴 implementation 'cn.yipianfengye.android:zxing-library:2.1' 這時候你要新增進去的話會有一個版本衝突,下面解決V4、V7版本衝突 //解決V4、V7版本衝突