我们有大约2k个对象,它们是ALAsset类的实例,我们需要知道哪些文件是全景图像.
我们试图从ALAsset实例获取CG ImageRef并检查宽度/高度比.
我们试图从ALAsset实例获取CG ImageRef并检查宽度/高度比.
ALAsset *alasset = ... CFImageRef = alasset.thumbnail; // return square thumbnail and not suitable for me CFImageRef = alasset.aspectRationThumbnail; //return aspect ration thumbnail,but very slowly
它不适合我们,因为它适用于许多文件.
此外,我们尝试从defaultRepresentation获取元数据并检查图像EXIF,但它工作缓慢.
NSDictionary *dictionary = [alasset defaultRepresentation] metadata]; //very slowly to
有没有办法让它变得更好?
谢谢
解决方法
最后,我发现了ALAsset的这个解决方案:
ALAssetsLibrary *assetsLibrary = ...; NSOperation *queue = [NSoperationQueue alloc] init]; static NSString * const kAssetQueueName = ...; static NSUInteger const kAssetConcurrentOperationCount = ...; //I use 5 queue.maxConcurrentOperationCount = kAssetConcurrentOperationCount; queue.name = kAssetQueueName; dispatch_async(dispatch_get_main_queue(),^{ [assetsLibrary enumerateGroupsWithTypes:ALAssetsGroupAll usingBlock:^(ALAssetsGroup *group,BOOL *stop) { /*You must check the group is not nil */ if (!group) return; /*Then you need to select group where you will search panoramas: for iPhone-Simulator it's @"Saved Photos" and "Camera Roll" for iPhone. It's actuality only for iOS 7 or early. */ static NSString * const kAssetGroupName = ...; if ([[group valueForProperty:ALAssetsGroupPropertyName] kAssetGroupName]) { [group enumerateAssetsUsingBlock:^(ALAsset *asset,NSUInteger index,BOOL *stop) { if (!asset) return; [queue addOperationWithBlock:^{ //I use @autoreleasepool for instant memory release,after I find panoramas asset url @autoreleasepool { ALAssetRepresentation *defaultRepresentation = asset.defaultRepresentation; if ([defaultRepresentation.UTI isEqualToString:@"public.jpeg"]) { NSDictionary *metadata = defaultRepresentation.metadata; if (!metadata) return; if (metadata[@"PixelWidth"] && metadata[@"PixelHeight"]) { NSInteger pixelWidth = [metadata[@"PixelWidth"] integerValue]; NSInteger pixelHeight = [metadata[@"PixelHeight"] integerValue]; static NSUInteger const kSidesRelationshipConstant = ...; //I use 2 static NSUInteger const kMinimalPanoramaHeight = ...; //I use 600 if (pixelHeight >= kMinimalPanoramaHeight && pixelWidth/pixelHeight >= kSidesRelationshipConstant) {/*So,that is panorama.*/} } }]; }]; } } failureBlock:^(NSError *error) { //Some failing action,you know. }]; };
那是.所以,我认为这不是最好的解决方案.但是,今天我没有找到更好的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。