【问题标题】:How to properly detect a PHAsset's file type (GIF)如何正确检测 PHAsset 的文件类型 (GIF)
【发布时间】:2016-05-23 00:55:22
【问题描述】:

我不知道为什么这么难。我正在尝试确定 PHAsset 的文件类型,具体来说,我想知道给定的资产是否代表 GIF 图像。

只需检查资产的文件名就知道它是 MP4:

[asset valueForKey:@"filename"] ==> "IMG_XXXX.MP4"

保存到设备图像库时,iOS 是否会将 GIF 转换为视频?我也尝试过获取图像的数据并查看它的 dataUTI,但它只为 GIF 返回nil(我假设所有视频也是如此)。我正在按如下方式获取图像数据:

PHImageManager *manager = asset.imageManager ? asset.imageManager : [PHImageManager defaultManager];

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    PHImageRequestOptions *o = [[PHImageRequestOptions alloc] init];
    o.networkAccessAllowed = YES;

    [manager requestImageDataForAsset:asset.asset options:o resultHandler:^(NSData * _Nullable imageData, NSString * _Nullable dataUTI, UIImageOrientation orientation, NSDictionary * _Nullable info) {

        dispatch_async(dispatch_get_main_queue(), ^{
            CIImage *ciImage = [CIImage imageWithData:imageData];
            if(completion) completion(imageData, dataUTI, orientation, info, ciImage.properties);
        });

    }];

});

上述调用返回的dataUTI是nil

如果有人知道确定 PHAsset 文件类型的可靠方法(我专门寻找 GIF,但能够确定任何类型的文件会很棒),请告诉我!

【问题讨论】:

  • 你找到答案了吗?
  • 你找到答案了吗?

标签: ios objective-c gif photos phasset


【解决方案1】:

使用 PHAssetResource。

    NSArray *resourceList = [PHAssetResource assetResourcesForAsset:asset];
    [resourceList enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
        PHAssetResource *resource = obj;
        if ([resource.uniformTypeIdentifier isEqualToString:@"com.compuserve.gif"]) {
           isGIFImage = YES;
        }
    }];

【讨论】:

    【解决方案2】:

    您还可以从PHContentEditingInput 类中找到uniformTypeIdentifier。为了这;使用 PHAsset 中的 requestContentEditingInput 函数

    别忘了 为 kUTTypeGif 导入 MobileCoreServices

    Swift 3.1 代码示例:

        let options = PHContentEditingInputRequestOptions()
        options.isNetworkAccessAllowed = true //for icloud backup assets
    
        let asset : PHAsset = .....  //sampleAsset
        asset.requestContentEditingInput(with: options) { (contentEditingInput, info) in
            if let uniformTypeIdentifier = contentEditingInput?.uniformTypeIdentifier {
    
                if uniformTypeIdentifier == (kUTTypeGIF as String) {
                    debugPrint("This asset is a GIF?")
                }
    
            }
        }
    

    【讨论】:

    • 这似乎不适用于 Photos.app 编辑扩展。我只在会话开始时通过了PHContentEditingInput(不是资产本身),属性uniformTypeIdentifiernil...
    • 这似乎有点笨拙,因为这个函数请求实际的图像/视频并准备编辑。而且它是异步的,这表明它需要一些时间/资源来执行。
    【解决方案3】:

    适用于 Swift 3.0 及以上版本

    import MobileCoreServices
    
    
    var isGIFImage = false
    if let identifier = asset.value(forKey: "uniformTypeIdentifier") as? String
    {
      if identifier == kUTTypeGIF as String
      {
        isGIFImage = true
      }
    }
    

    【讨论】:

    • 这是公钥吗?
    【解决方案4】:

    我猜从 iOS 11 开始,我们可以使用:

    if asset.playbackStyle == .imageAnimated {
        // try to show gif animation
    }
    

    【讨论】:

    • // 尝试显示 gif 动画
    【解决方案5】:

    首先,我不确定您所说的 GIF 图片是什么意思。
    您指的是实时照片还是延时摄影?

    但是,如果您要检查当前资产是 Live Photo、Time-lapse,那么您可以像这样检查

    if(asset.mediaSubtypes == PHAssetMediaSubtypePhotoLive)
    {
         // this is a Live Photo
    }
    
    if(asset.mediaSubtypes == PHAssetMediaSubtypeVideoTimelapse)
    {
         // this is a Time-lapse
    }
    

    要确定 PHAsset 的通用文件类型,您可以检查

       asset.mediaType == PHAssetMediaTypeImage 
       asset.mediaType == PHAssetMediaTypeVideo
       asset.mediaType == PHAssetMediaTypeAudio
    

    【讨论】:

    • 他指的是 .gif 格式的图像(动画图像),而不是实况照片或延时摄影。 .png、.jpg、.gif、.tiff 是所有类型的图像。 iOS 上的照片可以存储 gif,他问的是如何检测图像是否为 gif。
    【解决方案6】:
    //phAsset if object of phAsset
    
    if let imageType = phAsset.value(forKey: "uniformTypeIdentifier") as? String {
        if imageType == kUTTypeGIF as String { 
            //enter code here
        }
    }
    

    【讨论】:

    • 请提供一些解释,以便我们清楚地看到您的意图。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 2012-04-24
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    • 2023-03-07
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多