【问题标题】:Cannot get a clear image requested from Photo Album using PhotoKit无法使用 PhotoKit 从相册中获取请求的清晰图像
【发布时间】:2015-08-14 10:52:13
【问题描述】:

我正在使用 PhotoKit 来获取其中一个系统相册中的照片,如下所示:

PHFetchOptions *fetchOptions = [[PHFetchOptions alloc] init];
fetchOptions.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"creationDate" ascending:YES]];
PHFetchResult *fetchResult = [PHAssetCollection fetchAssetCollectionsWithType:PHAssetCollectionTypeSmartAlbum subtype:PHAssetCollectionSubtypeAlbumRegular options:nil];
[fetchResult enumerateObjectsUsingBlock:^(PHAssetCollection *collection, NSUInteger idx, BOOL *stop) {
    NSLog(@"ALBUM NAME: %@", collection.localizedTitle);
    if ([collection.localizedTitle isEqualToString:@"Camera Roll"]) {
        PHFetchResult *photos = [PHAsset fetchAssetsInAssetCollection:collection options:nil];
        NSLog(@"PHOTOS: %ld", photos.count);
        _photos = nil;
        _photos = @[].mutableCopy;
        for (PHAsset *asset in photos) {
            [self loadImageFromPHAsset:asset];
        }
    }
}];

然后在我的自定义辅助方法中:(void)loadImageFromPHAsset:(PHAsset *)asset,我有这个:

-(void)loadImageFromPHAsset:(PHAsset *)asset
{
    PHImageManager *manager = [PHImageManager defaultManager];
    CGSize targetSize = _layout.itemSize;
    [manager requestImageForAsset:asset targetSize:targetSize contentMode:PHImageContentModeAspectFill options:nil resultHandler:^(UIImage *result, NSDictionary *info) {
        [_photos addObject:result];
    }];
    [self.collectionView reloadData];
}

所以我有一组图像,并在我的UICollectionViewCell 中展示它们:

UIImage *image = [_photos objectAtIndex:indexPath.row];
cell.imageView.contentMode = UIViewContentModeScaleAspectFill;
cell.imageView.image = image;

但是我得到的是这样的,很模糊,我怎么才能看清楚呢?

【问题讨论】:

  • 我尝试了很多与PHImageRequestOptions 的选项组合,但仍然无法成功。

标签: ios uiimageview uiimage photokit


【解决方案1】:

首先 targetSize 应该乘以 scale 来解释屏幕的比例,像这样,

CGFloat scale = [UIScreen mainScreen].scale;
CGSize targetSize = CGSizeMake(_layout.itemSize.width*scale, _layout.itemSize.height*scale);

其次,尝试这些选项以获得确切大小的图像,

//Async call returned on main thread, can return multiple times
        
PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.resizeMode = PHImageRequestOptionsResizeModeExact;

最后,如果您有性能问题,请使用 PHCachingManager,我已经回答了有关性能改进的问题here

希望对你有所帮助。

编辑:

我没有意识到图像存储在数组中。尝试在图像选项中设置同步标志。

PHImageRequestOptions *options = [[PHImageRequestOptions alloc] init];
options.synchronous = YES;
options.resizeMode = PHImageRequestOptionsResizeModeExact;

【讨论】:

  • 感谢@jarora,实现你的代码后,它变得更清晰但不如iOS系统相册清晰。是因为我没有采用缓存机制吗?
  • @Boris 更新了答案。这将解决问题。如果您的问题得到解决,也将答案标记为正确:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-04
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多