2014-02-17 30 views
1

我要使用掃描zbar和SDK靜態的UIImage靜態的UIImage,它提供了錯誤即 ZBarSymbol是空Scaning使用的是iOS zbar和SDK

我還檢查

ZBarReaderController:的UIImagePickerController

但是,因爲它是UIImagePickerController的子類,我不想使用UIImagePickerController,因爲我只是想掃描UIImage,我有我的應用程序參考..我搜索allot這個問題,但D ID沒有得到任何幫助..

我也試過ZBarImageScanner爲,

- (void) scanFromUIImage: (UIImage *)img{ 


     // setup scaner 


    ZBarImageScanner *scanner = [[ZBarImageScanner alloc] init]; 

    Settings *settings = [Settings globalSettings]; 
    //ZBarImageScanner *scanner = reader.scanner; 

    BOOL haveLongLinear = NO; 
    for(NSString *str in settings.enabledSymbologies) { 
     NSNumber *value = [settings.enabledSymbologies objectForKey: str]; 
     BOOL enable = value.boolValue; 
     zbar_symbol_type_t sym = [str integerValue]; 

     [scanner setSymbology: sym 
         config: ZBAR_CFG_ENABLE 
          to: enable]; 

     if(sym == ZBAR_EAN13) { 
      // show EAN variants as such 
      [scanner setSymbology: ZBAR_UPCA 
          config: ZBAR_CFG_ENABLE 
           to: enable]; 
      [scanner setSymbology: ZBAR_UPCE 
          config: ZBAR_CFG_ENABLE 
           to: enable]; 
      [scanner setSymbology: ZBAR_ISBN13 
          config: ZBAR_CFG_ENABLE 
           to: enable]; 
     } 

     haveLongLinear |= enable && sym > ZBAR_COMPOSITE && sym != ZBAR_QRCODE; 
    } 


    ZBarImage *zbimg = [[ZBarImage alloc] initWithCGImage:img.CGImage]; 





    UIImage *image = screenShot; 
    id <NSFastEnumeration> results = [scanner scanImage:zbimg]; 

    //NSLog(@"-------> %@",results); 




    ZBarSymbol *sym = nil; 
    for(sym in results) 
     break; 
    assert(sym); 
    assert(image); 
    if(!sym || !image) 
     return; 

    Barcode *barcode = 
    [NSEntityDescription insertNewObjectForEntityForName: @"Barcode" 
            inManagedObjectContext: context]; 
    assert(barcode); 
    if(!barcode) 
     return; 

    assert(currentFolder); 

    // wana save safari screen shot to Safari Folder 
     Folder *folder = nil; 
     folder = [Folder defaultFolderInContext: context]; 
     if(folder != currentFolder) { 
      [currentFolder release]; 
      currentFolder = [folder retain]; 
     } 




    barcode.folder = currentFolder; 
    barcode.date = [NSDate date]; 
    barcode.image = image; 

    barcode.symbol = sym; 
    barcode.type = [NSNumber numberWithInteger: sym.type]; 
    barcode.data = sym.data; 

    barcode.name = nil; 
    barcode.thumb = nil; 

    NSArray *stack = nav.viewControllers; 
    BarcodeListController *_list = nil; 
    if(stack.count > 1) { 
     _list = [stack objectAtIndex: 1]; 
     if(![_list isKindOfClass: [BarcodeListController class]] || 
      _list.folder != currentFolder) 
      _list = nil; 
    } 

    if(_list) 
     [nav popToViewController: _list 
         animated: NO]; 
    else { 
     [nav popToRootViewControllerAnimated: NO]; 
     _list = [[[BarcodeListController alloc] 
        initWithFolder: currentFolder] 
       autorelease]; 
     [nav pushViewController: _list 
         animated: NO]; 
    } 

    UIViewController *detail = 
    [[BarcodeDetailController alloc] 
    initWithBarcode: barcode]; 
    [nav pushViewController: detail 
        animated: NO]; 
    [detail release]; 


    if(settings.autoLink) 
     [self performSelector: @selector(autoLink:) 
        withObject: barcode 
        afterDelay: 0.25]; 

    [window.rootViewController 
    adDismissModalViewController:self.safari 
    animated: YES]; 

    [self performSelector: @selector(genThumb:) 
       withObject: barcode 
       afterDelay: .5]; 




} 
+0

我解決了這個問題,看到下面的答案 – Baig

回答

1

得到了解決:

- (NSString *)scanForQR:(UIImage *)image 
{ 

    ZBarReaderController *imageReader = [ZBarReaderController new]; 

    [imageReader.scanner setSymbology: ZBAR_I25 
           config: ZBAR_CFG_ENABLE 
            to: 0]; 

    id <NSFastEnumeration> results = [imageReader scanImage:image.CGImage]; 

    ZBarSymbol *sym = nil; 
    for(sym in results) { 
     break; 
    } // Get only last symbol 

    if (!sym) { 
     NSLog(@"No barcode found"); 
     return nil; 
    } 

    NSLog(@"Found barcode! quality: %d string: %@", sym.quality, sym.data); 
    return sym.data; 
} 
2

的貝格的精彩解決方案精簡通用版本。將ZBAR_I25更改爲所需的代碼格式。

- (NSString *)findQRCode:(UIImage *)inputUIImage 
{ 

    ZBarReaderController *imageReader = [ZBarReaderController new]; 

    [imageReader.scanner setSymbology: ZBAR_I25 
           config: ZBAR_CFG_ENABLE 
            to: 0]; 

    id <NSFastEnumeration> results = [imageReader scanImage:inputUIImage.CGImage]; 

    ZBarSymbol *sym = nil; 
    for(sym in results) { 
     break; 
    } // Get only last symbol 

    if (!sym) { 
     NSLog(@"No barcode found"); 
     return nil; 
    } 

    NSLog(@"Found barcode! quality: %d string: %@", sym.quality, sym.data); 
    return sym.data; 
}