生成二維碼和掃描二維碼

一、生成二維碼


導入頭文件

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

#import <AVFoundation/AVFoundation.h>


生成二維碼其實就是把一段字符串存入到二維碼中,在掃描時能讀取到這串字符串。

// 1.實例化二維碼濾鏡

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

// 2.恢復濾鏡的默認屬性 (因為濾鏡有可能保存上一次的屬性)

[filter setDefaults];

// 3.將字符串轉換成NSdata

NSData *data? = [@"http://www.baidu.com" dataUsingEncoding:NSUTF8StringEncoding];

// 4.通過KVO設置濾鏡, 傳入data, 將來濾鏡就知道要通過傳入的數據生成二維碼

[filter setValue:data forKey:@"inputMessage"];

// 5.生成二維碼

CIImage *outputImage = [filter outputImage];

UIImage *image = [UIImage? imageWithCIImage:outputImage];

// 6.設置生成好得二維碼到imageview上

self.imgView.image = image;


二、掃描二維碼


導入頭文件 #import <AVFoundation/AVFoundation.h>

遵循代理 AVCaptureMetadataOutputObjectsDelegate

聲明屬性 :

@property (nonatomic, strong) AVCaptureSession *session;

@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;

1.打開攝像機

// 1. 實例化拍攝設備

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

// 2. 設置輸入設備

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

// 3. 設置元數據輸出

// 3.1 實例化拍攝元數據輸出

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

// 3.3 設置輸出數據代理

[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

// 4. 添加拍攝會話

// 4.1 實例化拍攝會話

AVCaptureSession *session = [[AVCaptureSession alloc] init];

// 4.2 添加會話輸入

[session addInput:input];

// 4.3 添加會話輸出

[session addOutput:output];

// 4.3 設置輸出數據類型,需要將元數據輸出添加到會話后,才能指定元數據類型,否則會報錯

[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

self.session = session;

// 5. 視頻預覽圖層

// 5.1 實例化預覽圖層, 傳遞_session是為了告訴圖層將來顯示什么內容

AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];

preview.videoGravity = AVLayerVideoGravityResizeAspectFill;

preview.frame = self.view.bounds;

// 5.2 將圖層插入當前視圖

[self.view.layer insertSublayer:preview atIndex:100];

self.previewLayer = preview;

// 6. 啟動會話

[_session startRunning];


2.掃描二維碼實現代理方法

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

{

// 會頻繁的掃描,調用代理方法

// 1. 如果掃描完成,停止會話

[self.session stopRunning];

// 2. 刪除預覽圖層

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

[self.previewLayer removeFromSuperlayer];

NSLog(@"%@", metadataObjects);

// 3. 設置界面顯示掃描結果

if (metadataObjects.count > 0) {

AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];

// 提示:如果需要對url或者名片等信息進行掃描,可以在此進行擴展!

NSLog(@"%@", obj.stringValue);

self.block(obj.stringValue);

}

[self dismissViewControllerAnimated:YES completion:nil];

});

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容