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

Posted

技术标签:

【中文标题】从 iOS 中的相机胶卷中获取特定图像【英文标题】:Fetching specific image from Camera roll in iOS 【发布时间】:2016-02-19 08:56:26 【问题描述】:

目前我正在使用 UIImageWriteToSavedPhotosAlbum 通过点击特定按钮从特定网址保存图像。图片保存成功。

现在,稍后我想通过点击相机胶卷相册 ios 中的相同按钮来检索相同的图像。我不想再次调用图像的 url。

如何使用 Objective-C 实现这一结果?

 [[SDWebImageDownloader sharedDownloader] downloadImageWithURL:url
                             options:0
                            progress:^(NSInteger receivedSize, NSInteger expectedSize) 

                            
                           completed:^(UIImage *image, NSData *data, NSError *error, BOOL finished) 
                               if (image && finished) 
                                   UIImageWriteToSavedPhotosAlbum(image,self,
                                       @selector(image:didFinishSavingWithError:contextInfo:),
                                                                      nil);
                               
                           ];

【问题讨论】:

你能发布你的代码吗? 改用 ALAssestLibrary 方法,您将拥有更多控制权。 @elio.d - 但是当前版本的 iOS 已弃用此库。 @RohitaxRajguru 不推荐使用并不意味着您不能使用它。无论如何,使用作为替代品的 PhotoFramework。 @KamleshShinarakhiya:添加了上面的代码。 【参考方案1】:

您必须使用 Photos 框架而不是使用 UIImageWriteToSavedPhotosAlbum 保存。

获取图片后使用照片框架保存它。

__block PHObjectPlaceholder *placeholderAsset;

    [[phphotoLibrary sharedPhotoLibrary] performChanges:^

       PHAssetChangeRequest *changeRequest = [PHAssetChangeRequest creationRequestForAssetFromImage:image];
       placeholderAsset = changeRequest.placeholderForCreatedAsset;

     completionHandler:^(BOOL success, NSError *error) 
        if (success) 
            NSLog(@"Success");

            // Save Identifier here
            [[NSUserDefaults standardUserDefaults] setObject:placeholderAsset.localIdentifier forKey:@"PhotoIdentifier"];
        
        else 
            NSLog(@"write error : %@",error);
        
    ];

// 使用标识符检索图像

PHFetchOptions *allPhotosOptions = [[PHFetchOptions alloc] init];
allPhotosOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:NO]];
PHFetchResult *allPhotos = [PHAsset fetchAssetsWithOptions:allPhotosOptions];

[allPhotos enumerateObjectsUsingBlock:^(PHAsset   * _Nonnull photoAsset, NSUInteger idx, BOOL * _Nonnull stop) 

    NSString *photoIdentifier = [[NSUserDefaults standardUserDefaults] objectForKey:@"PhotoIdentifier"];
    if([photoIdentifier isEqualToString:photoAsset.localIdentifier])

        [[PHImageManager defaultManager]requestImageForAsset:photoAsset targetSize:PHImageManagerMaximumSize contentMode:PHImageContentModeDefault options:nil resultHandler:^(UIImage *result, NSDictionary *info)
            if ([info objectForKey:PHImageErrorKey] == nil && ![[info objectForKey:PHImageResultIsDegradedKey] boolValue]) 

                // image is here as a result parameter
                *stop = YES;
            
        ];
    
];

您可以使用任何其他介质来存储照片标识符,NSUserDefaults 只是一个示例。

【讨论】:

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

从相机胶卷中获取所有图像并将其显示在滚动视图上?

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

当我在设备上运行程序时,AssetsLibrary 没有获取保存在相机胶卷中的图像

iOS:从相机胶卷中获取最后一张图片

从 iPhone 相机胶卷中获取图像

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