photolibrary - 我无法在 ZBarSDK 中使用 sourceType 作为 UIImagePickerControllerSourceTypePhotoLibrary

标签 photolibrary zbar-sdk

我在http://zbar.sourceforge.net/download.html下载ZBarSDK 1.2 当我将 ZBarReaderViewController 的 sourceType 设置为 UIImagePickerControllerSourceTypeCamera 时效果很好。 但是当我将 sourceType 设置为 UIImagePickerControllerSourceTypePhotoLibrary 或 UIImagePickerControllerSourceTypeSavedPhotosAlbum 时,应用程序崩溃并收到如下错误:

2012-05-28 17:23:03.476 Wow[4137:10703] * Assertion failure in -[ZBarReaderViewController setSourceType:], /Users/spadix/zbar/hg/sdk/iphone/ZBarReaderViewController.m:650 2012-05-28 17:23:03.626 Wow[4137:10703] * Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'attempt to set unsupported value (1) for sourceType property'

我google了这个问题,但找不到解决方案。有人可以告诉我如何解决这个问题吗?1.2版本只支持UIImagePickerControllerSourceTypeCamera吗?我下载的源代码是否有问题?

谢谢。

最佳答案

如果你想选择保存的图像,基本上呈现标准的 iOS 媒体 View Controller 。用户从标准 iOS 媒体 Controller 选择图像后,您可以实例化 ZBarImageScanner 的副本来扫描图像。如果这是有意义的,请跳到步骤 5 以了解如何使用 ZBarImageScanner 扫描 UIImage。否则,请尝试按照以下步骤操作。希望这会有所帮助。

  1. 首先向用户显示带有选项的警报。

    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"" delegate:self  
                                              cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera", @"Camera   Roll", @"Photo Library", nil];
    [sheet showInView:self.view];
    
  2. 选择时,

    - (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex {
        UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;
        switch (buttonIndex) {
            case 0: sourceType = UIImagePickerControllerSourceTypeCamera; break;
            case 1: sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum; break;
            case 2: sourceType = UIImagePickerControllerSourceTypePhotoLibrary; break;
            default: break;
        }
        if ( buttonIndex <= 2 ) {
            [self presentBarcodeReader:sourceType];
        }
    }
    
  3. 当且仅当sourceType == UIImagePickerControllerSourceTypeCamera时,才使用ZBar呈现图像采集界面。

    - (void)presentBarcodeReader:(UIImagePickerControllerSourceType)sourceType {
        if ( sourceType == UIImagePickerControllerSourceTypeCamera ) {
            ZBarReaderViewController *reader = [ZBarReaderViewController new];
            reader.readerDelegate = self;
            reader.showsZBarControls = YES;
            reader.supportedOrientationsMask = ZBarOrientationMaskAll;
    
            ZBarImageScanner *scanner = reader.scanner;
            [scanner setSymbology: ZBAR_I25
                           config: ZBAR_CFG_ENABLE
                               to: 0];
            [self presentModalViewController:reader animated:YES];
        } else {
            UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init];
            mediaUI.sourceType = sourceType;
            mediaUI.mediaTypes = [UIImagePickerController         availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeSavedPhotosAlbum];
            mediaUI.allowsEditing = NO;
            mediaUI.delegate = self;
            [self presentModalViewController:mediaUI animated:YES];
        }
    }
    
  4. 我们可以通过几种方法来检测使用了哪个媒体选择器

    - (void)imagePickerController:(UIImagePickerController*)reader didFinishPickingMediaWithInfo:(NSDictionary*)info {
        id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults];
        if ( results ) {
            ZBarSymbol *symbol = nil;
            for (symbol in results) break;
    
            [reader dismissViewControllerAnimated:YES completion:^{
                [self partLookup:symbol.data];
            }];
        } else {
            UIImage *image = [info objectForKey:UIImagePickerControllerEditedImage] ?         [info objectForKey:UIImagePickerControllerEditedImage] : [info         objectForKey:UIImagePickerControllerOriginalImage];
            [self scanImage:image];
        }
    }
    
  5. 还有多汁的部分

    - (void)scanImage:(UIImage*)image {
        ZBarImage *zImage = [[ZBarImage alloc] initWithCGImage:image.CGImage];
        ZBarImageScanner *scanner = [[ZBarImageScanner alloc] init];
        [scanner setSymbology: ZBAR_I25
                       config: ZBAR_CFG_ENABLE
                           to: 0];
        [scanner scanImage:zImage];
        ZBarSymbolSet *set = [scanner results];
    
        for (ZBarSymbol *symbol in set) {
            NSLog(@"%@", symbol.data);
            // process symbol.data however you please.
        }
    }
    

关于photolibrary - 我无法在 ZBarSDK 中使用 sourceType 作为 UIImagePickerControllerSourceTypePhotoLibrary,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10782660/

相关文章:

ios - 如果不允许 UIImagePickerController 访问照片库,则显示 UIActionSheetUser

iphone - 图像质量较低不像在相册中显示

iOS:CGImageCreateWith[PNG 或 JPEG]DataProvider 导致段错误

iPhone 如何显示我的文档目录中的照片?

iphone - 在iPhone中不使用AVCaptureSession调用UIImagePickerControl的方法

ios - 如何在 xcode 中将图像覆盖在图像上?

xcode 4.5 - 找不到架构 i386 (zbar) 的符号

ios - ZBar:架构 armv7 的 undefined symbol

iphone - zbar应用中扫描页面的自定义

gcc - 无法关闭 gcc 优化器,来自 automake 的 Makefile