ios 中產生二維碼和相簿中識別二維碼

來源:互聯網
上載者:User

標籤:

iOS 使用CIDetector掃描相簿二維碼、原生掃描原生掃描
  • iOS7之後,AVFoundation讓我們終於可以使用原生掃描進行掃碼了(二維碼與條碼皆可)AVFoundation可以讓我們從裝置中擷取到輸入資料流與輸出資料流,從而擷取二維碼中包含的資訊。

  • 實現原生掃描非常簡單。
    1.先匯入AVFoundation架構。
    <AVFoundation/AVFoundation.h>
    2.接著設定代理,實現代理回調方法
    AVCaptureMetadataOutputObjectsDelegate
    3.然後建立幾個類即可:
    裝置 AVCaptureDevice
    捕捉會話 AVCaptureSession
    輸入資料流 AVCaptureDeviceInput
    輸出資料流 AVCaptureMetadataOutput
    預覽圖層 AVCaptureVideoPreviewLayer

  • 下面是簡單的代碼實現樣本

      NSError *error = nil;  AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];//裝置  AVCaptureSession *session = [[AVCaptureSession alloc] init];//捕捉會話  [session setSessionPreset:AVCaptureSessionPresetHigh];//設定採集率  AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];//輸入資料流  AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];//輸出資料流  //添加到捕捉會話  [session addInput:input];  [session addOutput:output];  //掃碼類型:需要先將輸出資料流添加到捕捉會話後再進行設定  //這裡只設定了可掃描二維碼,有條碼需要,在數組中繼續添加即可  [output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];  //輸出資料流delegate,在主線程重新整理UI  [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];  AVCaptureVideoPreviewLayer *videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:session];//預覽  videoPreviewLayer.frame = self.view.bounds;  [self.view.layer insertSublayer:videoPreviewLayer atIndex:0];//添加預覽圖層  //還可以設定掃描範圍 output.rectOfInterest  不設定預設為全屏  //開始掃描  [session startRunning];
  • 接著實現掃碼成功的回調方法

    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {    NSString *content = @"";    AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;    content = metadataObject.stringValue;//擷取到二維碼中的資訊字串    //對此字串進行處理(音效、網址分析、頁面跳轉等)}
  • 我們還可以添加掃碼成功後的聲音與震動效果,提高使用者體驗
    - (void)playBeep{  SystemSoundID soundID;  AudioServicesCreateSystemSoundID((__bridge CFURLRef)[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"滴-2"ofType:@"mp3"]], &soundID);  AudioServicesPlaySystemSound(soundID);  AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);}
從相簿擷取二維碼
  • iOS8之後,可以使用CIDetector(CIDetector可用於Face Service)進行圖片解析,從而使我們可以便捷的從相簿中擷取到二維碼。
  • 1.調用系統相簿,從系統相簿中選取圖片
    2.使用探測器(CIDetector)對選取的圖片進行處理,取得圖片二維碼中包含的資料資訊。
  • 下面是簡單的代碼實現樣本

    - (void)choicePhoto{  //調用相簿  UIImagePickerController *imagePicker = [[UIImagePickerController alloc]init];  imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  imagePicker.delegate = self;  [self presentViewController:imagePicker animated:YES completion:nil];}//選中圖片的回調-(void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{  NSString *content = @"" ;  //取出選中的圖片  UIImage *pickImage = info[UIImagePickerControllerOriginalImage];  NSData *imageData = UIImagePNGRepresentation(pickImage);  CIImage *ciImage = [CIImage imageWithData:imageData];  //建立探測器  CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy: CIDetectorAccuracyLow}];  NSArray *feature = [detector featuresInImage:ciImage];  //取出探測到的資料  for (CIQRCodeFeature *result in feature) {      content = result.messageString;  }  //進行處理(音效、網址分析、頁面跳轉等)}

ios 中產生二維碼和相簿中識別二維碼

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.