1. 程式人生 > >iOS使用ZBar實現二維碼掃描以及實現識別相簿中二維碼圖片功能

iOS使用ZBar實現二維碼掃描以及實現識別相簿中二維碼圖片功能

使用zbar呼叫相機掃碼程式碼:

//開啟相機

- (void) init_camera

{

self.navigationController.navigationBarHidden=YES;

    [commonaddNavigationAddToView:self.viewInfo:@"二維碼"Target:selfaction:@selector(returnbtn:) PatientName:@"掃碼"];

UIButton *rightBtn=[UIButtonbuttonWithType:UIButtonTypeCustom];

    [rightBtn setFrame

:CGRectMake(kScreenWidth-18-40, 19, 40, 40)];

    [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

].bounds.size.width;

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;

}