首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从ALAsset对象获取全景图

如何从ALAsset对象获取全景图
EN

Stack Overflow用户
提问于 2014-07-01 20:55:15
回答 1查看 336关注 0票数 4

我们有大约2k个对象,它们是ALAsset类的实例,我们需要知道哪些文件是全景图像。我们已经尝试从ALAsset实例中获取CGImageRef,并检查宽高比。

代码语言:javascript
运行
复制
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,但它的工作速度很慢。

代码语言:javascript
运行
复制
NSDictionary *dictionary = [alasset defaultRepresentation] metadata]; //very slowly to

有没有办法让它变得更好?

谢谢

EN

回答 1

Stack Overflow用户

发布于 2015-01-21 19:00:05

最后,我为ALAsset找到了这个解决方案:

代码语言:javascript
运行
复制
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.
  }];
};

那是。所以,我认为这不是最好的解决方案。然而,对于今天,我没有找到更好的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24510857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档