从相机胶卷中异步获取所有图像

Posted

技术标签:

【中文标题】从相机胶卷中异步获取所有图像【英文标题】:Get All Images from cameraroll asynchrously 【发布时间】:2015-09-09 06:23:54 【问题描述】:

我想 现在我正在使用该代码,但我的应用程序被挂起,直到检索到所有图像,我注意到在 instigram 或其他应用程序中从camerroll加载图片不需要时间。

-(void)getAllPictures


    NSLog(@"i m in ");

    imageArray=[[NSArray alloc] init];
    mutableArray =[[NSMutableArray alloc]init];
    NSMutableArray* assetURLDictionaries = [[NSMutableArray alloc] init];
        library = [[ALAssetsLibrary alloc] init];
        void (^assetEnumerator)( ALAsset *, NSUInteger, BOOL *) = ^(ALAsset *result, NSUInteger index, BOOL *stop) 

            NSLog(@"i m in block");
        if(result != nil) 
            if([[result valueForProperty:ALAssetPropertyType] isEqualToString:ALAssetTypePhoto]) 


                NSLog(@"result not nill");


                [assetURLDictionaries addObject:[result valueForProperty:ALAssetPropertyURLs]];

                NSURL *url= (NSURL*) [[result defaultRepresentation]url];
                NSLog(@"url=%@",url);
                [library assetForURL:url
                         resultBlock:^(ALAsset *asset) 
                             [mutableArray addObject:[UIImage imageWithCGImage:[[asset defaultRepresentation] fullScreenImage]]];





                             imageArray=[[NSArray alloc] initWithArray:mutableArray];
                             [self allPhotosCollected:imageArray];


                             if ([mutableArray count]==count)
                             NSLog(@"condition %lu , %i",(unsigned long)mutableArray.count,count);


                                 imageArray=[[NSArray alloc] initWithArray:mutableArray];
                                 [self allPhotosCollected:imageArray];
                             
                         
                        failureBlock:^(NSError *error) NSLog(@"operation was not successfull!");  ];

            
        
    ;


    NSLog(@"image array= %@",imageArray);

    NSMutableArray *assetGroups = [[NSMutableArray alloc] init];

    void (^ assetGroupEnumerator) ( ALAssetsGroup *, BOOL *)= ^(ALAssetsGroup *group, BOOL *stop) 
        if(group != nil) 


            NSLog(@"group not nill");
            [group enumerateAssetsUsingBlock:assetEnumerator];
            [assetGroups addObject:group];
            count=(int)[group numberOfAssets];
        
    ;

    assetGroups = [[NSMutableArray alloc] init];

    [library enumerateGroupsWithTypes:ALAssetsGroupAll
                           usingBlock:assetGroupEnumerator
                         failureBlock:^(NSError *error) NSLog(@"There is an error");];


-(void)allPhotosCollected:(NSArray*)imgArray

    //write your code here after getting all the photos from library...
    NSLog(@"all pictures are %@",imgArray);
    [_collection_view reloadData];



   /*
    CGRect collectionFrame = self.collection_view.frame;

    collectionFrame.size.height=700;
    collectionFrame.size.width=320;*/

self.verticalLayoutConstraint.constant = 700;
    //self.collection_view.frame=collectionFrame;

【问题讨论】:

【参考方案1】:

像这样尝试..它的速度越来越快。如果您将获取数组中的所有图像,那么它会在使用包含 1000 多张照片的 iPhone 和 iPad 时使您的应用程序崩溃。所以试试这样。

library = [[ALAssetsLibrary alloc] init];

if (library == nil)
    library = [[ALAssetsLibrary alloc] init];

[library enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group, BOOL *stop)


    [group enumerateAssetsUsingBlock:^(ALAsset *asset, NSUInteger index, BOOL *stop)
     
         if (asset)
         
             [imageArray addObject:asset];
             [collectionViewObj reloadData];
         
     ];
 
                failureBlock:^(NSError *error) 

    UIAlertView *alertViewObj = [[UIAlertView alloc]initWithTitle:@"Max6Miz does not have access to your photos" message:@"You can enable access in Settings" delegate:self cancelButtonTitle:nil otherButtonTitles:@"Settings",@"Ok", nil];
    [alertViewObj show];
    NSLog(@"error");
];

使用 collectionView cellForItemAtIndexPath

在您的委托函数中显示您的图像
ALAsset *asset = (ALAsset *)imageArray[indexPath.row];
UIImage *showingImage = [UIImage imageWithCGImage:[asset thumbnail]];

【讨论】:

在这种情况下,我们如何才能获得完整的图像?例如,当我们点击缩略图时,我想使用原始图像 感谢我从这里获得全屏图像***.com/questions/21494338/…【参考方案2】:

请使用ios 8.0 提供的新现代Photos framework。我已经在我自己的iCloud Photo Library 存储在数百个相册中的 50k 照片和 1.5k 视频上对其进行了测试。它运行速度很快,可以跟踪专辑和资产的变化并为其设置动画。

这是一篇以Photos framework开头的好文章:https://www.objc.io/issues/21-camera-and-photos/the-photos-framework/

【讨论】:

感谢您的回复,但我对 alasset 库很熟悉,我更喜欢它

以上是关于从相机胶卷中异步获取所有图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHPhotoLibrary 从相机胶卷中获取相机点击的照片

从 iPhone 相机胶卷中获取图像

从 iOS 中的相机胶卷中获取特定图像

将相机胶卷中的所有图像存储为数组

如何在 Swift 中按名称/标识符从相机胶卷中获取图像

除了相机胶卷,如何从 iPhone 中获取所有资产?