如何从ALAsset对象中获取全景照片

4

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

ALAsset *alasset = ...
CFImageRef = alasset.thumbnail; // return square thumbnail and not suitable for me
CFImageRef = alasset.aspectRationThumbnail; //return aspect ration thumbnail, but very slowly

对于我们来说不太适用,因为它在处理大量文件时速度较慢。

我们也尝试从默认表示法获取元数据并检查图像EXIF,但这样做速度也比较慢。

NSDictionary *dictionary = [alasset defaultRepresentation] metadata]; //very slowly to

有没有办法让它更好?谢谢。

你能详细说明一下“这些方法对我来说不适用”的原因吗?这样人们才能理解问题所在。如果只是性能问题,那么最好将其添加到主要问题文本中,以免被忽略。 - mc110
@mc110,我更新了我的问题。谢谢。 - VladMihaylenko
@VladMihaylenko 你是如何在ALAsset中检测全景图像的? - Nicolas Manzini
@NicolasManzini 我在下面回答了我的问题。 - VladMihaylenko
1个回答

1
最终,我找到了这个与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.
  }];
};

那样做。所以,我认为那不是最好的解决方法。然而,今天我还没有找到更好的。

我本来想尝试访问嵌入在JPG中的元数据。你的帖子对我来说似乎是一个公平的解决方案。非常感谢,你为我节省了一些时间! - Nicolas Manzini
ALAssetRepresentation有一个尺寸属性。这对于您的目的来说不够吗? - Nicolas Manzini
@NicolasManzini 获取defaultRepresentation是这个问题的“瓶颈”。一旦获取它,您就不需要担心像获取元数据等其他操作的时间。 - VladMihaylenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接