iOS使用ZBar實現二維碼掃描以及實現識別相簿中二維碼圖片功能
使用zbar呼叫相機掃碼程式碼:
//開啟相機
- (void) init_camera
{
self.navigationController.navigationBarHidden=YES;
[commonaddNavigationAddToView:self.viewInfo:@"二維碼"Target:selfaction:@selector(returnbtn:) PatientName:@"掃碼"];
UIButton *rightBtn=[UIButtonbuttonWithType:UIButtonTypeCustom];
[rightBtn
setFrame
[rightBtn setTitle:@"相簿"forState:UIControlStateNormal];
[rightBtn.titleLabelsetFont:[UIFontsystemFontOfSize:16]];
[self.viewaddSubview:rightBtn];
[rightBtn
addTarget:selfaction:@selector(rightBtnClick)
forControlEvents:UIControlEventTouchUpInside
//開啟zbar封裝好的拍照介面
ZBarReaderView * reader = [ZBarReaderViewnew];
ZBarImageScanner * scanner = [ZBarImageScannernew];
[scanner setSymbology:ZBAR_PARTIALconfig:0to:0];
reader.readerDelegate = self;
constfloat h = [UIScreenmainScreen].bounds.size.height;
constfloat w = [UIScreenmainScreen
CGRect reader_rect1 = CGRectMake(0, 60, w, h-60);//全屏模式
reader.frame = reader_rect1;
reader.backgroundColor = [UIColorredColor];
[reader start];
[self.viewaddSubview: reader];
//新增覆蓋檢視
_overLayView = [[ZbarOverlayViewalloc]initWithFrame:CGRectMake(0, 0, reader.frame.size.width, reader.frame.size.height)];
//[_overLayView startAnimation];
_overLayView.transparentArea = CGRectMake(50, 100, kScreenWidth-100, kScreenWidth-100);//設定中間可選框大小
[reader addSubview:_overLayView];
//設定掃描識別框
reader.scanCrop=CGRectMake(0, 0, 1, 1);
}
//掃描結果的代理方法
#pragma mark - ZbarReaderView Delegate
- (void) readerView:(ZBarReaderView *)readerView didReadSymbols: (ZBarSymbolSet *)symbols fromImage:(UIImage *)image
{
ZBarSymbol * s = nil;
for (s in symbols)
{
//s.data為識別到的二維碼轉換的資訊,開發者進行各種處理
[selfgetTicketDetailInfo:s.data];
break;
}
//如果沒有掃描到二維碼資訊,進行報錯提示
UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:nilmessage:@"沒有識別到圖片中二維碼"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"確定", nil];
[alert show];
}
//呼叫相簿圖片並識別其中二維碼資訊程式碼:
定義全域性變數:ZBarReaderController *imagePicker;
//開啟相簿操作
ZBarReaderController相當於對bar系統相簿的一個封裝
-(void)rightBtnClick
{
imagePicker = [ZBarReaderControllernew];
imagePicker.allowsEditing = NO ;
imagePicker.showsHelpOnFail = NO;
imagePicker.readerDelegate = self;
imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[selfpresentViewController:imagePickeranimated:YEScompletion:nil];
}
#pragma mark - ZBarReaderController ReadDelegate
//相簿選取圖片後的代理方法對應ZBarReaderController
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info{
id<NSFastEnumeration> results = [info objectForKey:ZBarReaderControllerResults];
ZBarSymbol *symbol = nil;
for(symbol in results) {
NSLog(@"symbol:%@", symbol);
break;
}
[imagePicker dismissViewControllerAnimated:YEScompletion:nil];
//二維碼字串
NSString *QRCodeString = symbol.data;
//處理二維碼圖片資訊
[selfgetTicketDetailInfo:QRCodeString];
}
//選擇圖片沒有二維碼資訊的代理方法
-(void)readerControllerDidFailToRead:(ZBarReaderController *)reader withRetry:(BOOL)retry
{
if (retry) {
//retry == 1 選擇圖片為非二維碼。
UIAlertView *alert = [[UIAlertViewalloc]initWithTitle:nilmessage:@"沒有識別到圖片中二維碼"delegate:selfcancelButtonTitle:nilotherButtonTitles:@"確定", nil];
[alert show];
[selfdismissViewControllerAnimated:YEScompletion:nil];
}
return;
}