ios - 使用ios ZBar SDK扫描静态UIImage

标签 ios objective-c uiimage zbar-sdk

我想使用Zbar sdk扫描静态UIImage,它给出了错误,即
ZBarSymbol为空

我也检查了

ZBarReaderController:UIImagePickerController

但是因为它是UIImagePickerController的子类,并且我根本不想使用UIImagePickerController,因为我只想扫描我在应用程序中引用的UIImage。.我在分配中搜索了此问题,但没有任何帮助。

我也尝试过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];




}

最佳答案

Baig出色解决方案的简化通用版本。将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;
}

关于ios - 使用ios ZBar SDK扫描静态UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21822521/

相关文章:

ios - UIBezierPath : Make image of drawing only

ios - 标签栏 Controller : accessing a property of inside UIViewController

objective-c - UIImage,有没有一种简单的方法可以使其变暗或全黑

ios - 切换到编辑模式时更改 UITableviewcell 中的 UILabel 宽度

ios - 在 Xcode 中,如何以编程方式从 .icns 文件中提取 .png 图像?

ios - handleKeyboardWillShow 通知处理

objective-c - iOS简单循环有什么问题?

objective-c - 如何在 Objective C 中使用 NSData 存储图像

ios - Swift 中 Realm 查询的交叉引用谓词

ios - 如何快速将特定格式转换为任何对象?