一、概述
1、通過某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄資料符號資訊的
2、二維碼通常可以包含以下內容
3、二維碼具有非常廣泛的應用
- 二維碼名片
- 掃碼付款
- 網址(URL),掃描後自動開啟網址
二、二維碼的產生
1、產生原理
通過一個類CIFilter(濾鏡)包含二維碼中所有的資訊,然後產生一張二維碼圖片
二維碼中間的icon(頭像),是通過在產生的圖片上添加一張圖片實現的
2、產生步驟
- 建立濾鏡
- 初始化濾鏡
- 添加二維碼資訊
- 擷取產生的二維碼圖片
- 將二維碼圖片展示出來
3、產生的二維碼的效果圖
4、具體代碼實現
1)、通過storyboard建立兩個imageView,分別用來展示二維碼圖片和頭像
2)、擁有展示二維碼圖片的imageView
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
3)、產生二維碼
/**點擊螢幕的時候顯示二維碼*/- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //1.建立濾鏡 CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; //2.恢複預設 [filter setDefaults]; //3.給濾鏡添加資料 NSString *dataString = @"http://www.xxx.com/theDesertIslandOutOfTheWorld/";// NSString *dataString = @"世俗孤島"; //將資料轉換成NSData類型 NSData *data = [dataString dataUsingEncoding:NSUTF8StringEncoding]; //通過KVC設定濾鏡的二維碼輸入資訊 [filter setValue:data forKey:@"inputMessage"]; //4.擷取輸出的二維碼圖片(CIImage類型) CIImage *outImage = [filter outputImage]; //將CIImage類型的圖片裝換成UIImage類型的圖片 UIImage *image = [UIImage imageWithCIImage:outImage]; //5.顯示二維碼圖片 self.imageView.image = image;}
4)、通過二維碼掃描工具,可以掃描產生的二維碼
若二維碼的輸入資訊是URL,則會開啟指定的網路資源
三、二維碼的掃描
1、注意:
- 二維碼掃碼需要使用網路攝影機,需要真機裝置
- Xcode7可是免費真機調試
2、二維碼掃描的過程
- 通過網路攝影機掃描二維碼
- 解析二維碼資料
- 根據二維碼資訊執行相應的操作
3、過程分析
1)、通過網路攝影機掃描二維碼資訊需要用到AVCaptureSession類
- 該類是用來協調從音頻/視頻輸入連接埠到輸出端的資料
- 該類需要一個輸入裝置AVCaptureDeviceInput,通常是網路攝影機
- 該類需要一個輸出端,輸出指定類型的資料,有多個類可以選擇(如:AVCaptureMetadataOutput)
- 需要調用- startRunning方法開啟輸入源
2)、通過AVCaptureSession類捕獲的資料,可以通過指定輸出端的過濾類型來以特定的類型解析捕獲的資料
3)、可以為輸出端AVCaptureMetadataOutput設定代理,來聽捕獲過程
4)、通過AVCaptureVideoPreviewLayer類將擷取的未經處理資料渲染到指定的圖層
4、二維碼的產生過程
通過成員屬性儲存輸入源與輸出端的協調者(AVCaptureSession對象)
@property (nonatomic, weak) AVCaptureSession *session;
通過成員屬性儲存展示通過輸入裝置輸入的中繼資料的圖層,用於在適當的時候移除圖層
@property (nonatomic, weak) AVCaptureVideoPreviewLayer *layer;
建立AVCaptureSession類的對象(簡稱:捕獲對象),用於捕獲音頻/視頻連接埠的資料
AVCaptureSession *session = [[AVCaptureSession alloc] init];self.session = session;
給捕獲對象添加輸入裝置(通常是網路攝影機)
//設定輸入裝置輸入資料的類型(視頻)AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];[session addInput:input];
給捕獲對象添加輸出端
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];//設定代理[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];[session addOutput:output];
設定輸入源的過濾條件(只擷取二維碼資訊)
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
將捕獲的未經處理資料顯示到控制器的view上
AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:session];layer.frame = self.view.bounds;[self.view.layer addSublayer:layer];
開始擷取資料
實現輸出端的代理方法,監聽捕獲過程
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if (metadataObjects.count > 0) { //擷取輸出端的資訊 AVMetadataMachineReadableCodeObject *object = [metadataObjects lastObject]; NSLog(@"%@", object.stringValue); //停止掃描 [self.session stopRunning]; //將展示圖層移除 [self.layer removeFromSuperlayer]; } else { NSLog(@"沒有掃描到資料"); }}
以上就是IOS二維碼名片產生與讀取的詳細代碼介紹,希望對大家的學習有所協助。