使用系統的AVMetadataObject類實現二維碼掃描
前言
有關二維碼的介紹,我這裡不做過多說明, 可以直接去基維百科檢視,附上鍊接QR code.
IOS7之前,開發者進行掃碼程式設計時,一般會藉助第三方庫。常用的是ZBarSDKa和ZXingObjC,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]; //設定掃碼支援的編碼格式(如下設定條形碼和二維碼相容) |
一些初始化的程式碼加上實現代理方法便完成了二維碼掃描的工作,這裡我們需要注意的是, 在二維碼掃描的時候, 我們一般都會在螢幕中間放一個方框,用來顯示二維碼掃描的大小區間,這裡我們在個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版本衝突