web-dev-qa-db-ja.com

PHAssetのファイルタイプ(GIF)を正しく検出する方法

なぜこんなに難しいのかわかりません。 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を探していますが、任意のタイプのファイルを判別できると便利です)、私に知らせてください!

13
mitchtreece

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;
        }
    }];
10
dongkang

また、 niformTypeIdentifier from PHContentEditingInput クラスを見つけることができます。このため; 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????")
            }

        }
    }
5
sirman

Swift 3.0以降の場合

import MobileCoreServices


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

まず、GIF画像とはどういう意味かわかりません。
ライブフォトまたはタイムラプスを参照していますか?

ただし、現在のアセットがライブフォト、タイムラプスであることを確認したい場合は、次のように確認できます

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
2
papsic
//phAsset if object of phAsset

if let imageType = phAsset.value(forKey: "uniformTypeIdentifier") as? String {
    if imageType == kUTTypeGIF as String { 
        //enter code here
    }
}
1
Manish Patel

IOS 11以降、次のものを使用できると思います。

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