標籤:atomic connect 輸出 www 預覽 tor 設定 input 數字
二維碼的產生
從iOS7開始整合了二維碼的產生和讀取功能
此前被廣泛使用的zbarsdk眼下不支援64位處理器
產生二維碼的步驟:
匯入CoreImage架構
通過濾鏡CIFilter產生二維碼
二維碼的內容(傳統的條碼僅僅能放數字):
純文字名片URL
產生二維碼
// 1. 執行個體化二維碼濾鏡CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];// 2. 恢複濾鏡的預設屬性[filter setDefaults];// 3. 將字串轉換成NSDataNSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];// 4. 通過KVO設定濾鏡inputMessage資料[filter setValue:data forKey:@"inputMessage"];// 5. 獲得濾鏡輸出的映像CIImage *outputImage = [filter outputImage];// 6. 將CIImage轉換成UIImage。並放大顯示return [UIImage imageWithCIImage:outputImage scale:20.0 orientation:UIImageOrientationUp];
讀取二維碼
讀取二維碼須要匯入AVFoundation架構
利用網路攝影機識別二維碼中的內容(模擬器不行)
輸入(網路攝影機)
由會話將網路攝影機採集到的二維碼映像轉換成字串資料
輸出(資料)
由預覽圖層顯示掃描情境
設定拍攝會話
// 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]];
設定拍攝視頻預覽圖層
// 5. 視頻預覽圖層// 5.1 執行個體化預覽圖層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];
產生百度二維碼執行個體
#import <CoreImage/CoreImage.h>@interface ViewController ()@property (weak, nonatomic) IBOutlet UIImageView *iv;@end@implementation ViewController- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ // 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.iv.image = image;}@end
執行個體圖
讀取百度二維碼執行個體
#import <AVFoundation/AVFoundation.h>@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>@property (nonatomic, strong) AVCaptureSession *session;@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;@end@implementation ViewController- (void)viewDidLoad { [super viewDidLoad]; // 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];}- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ // 會頻繁的掃描,調用代理方法 // 1. 假設掃描完畢。停止會話 [self.session stopRunning]; // 2. 刪除預覽圖層 [self.previewLayer removeFromSuperlayer]; NSLog(@"%@", metadataObjects); // 3. 設定介面顯示掃描結果 if (metadataObjects.count > 0) { AVMetadataMachineReadableCodeObject *obj = metadataObjects[0]; // 提示:假設須要對url或者名片等資訊進行掃描,能夠在此進行擴充。 NSLog(@"%@", obj.stringValue); }}@end
iOS開發 - 二維碼的產生與讀取