なぜこんなに難しいのかわかりません。 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を探していますが、任意のタイプのファイルを判別できると便利です)、私に知らせてください!
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;
}
}];
また、 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????")
}
}
}
Swift 3.0以降の場合
import MobileCoreServices
var isGIFImage = false
if let identifier = asset.value(forKey: "uniformTypeIdentifier") as? String
{
if identifier == kUTTypeGIF as String
{
isGIFImage = true
}
}
まず、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
//phAsset if object of phAsset
if let imageType = phAsset.value(forKey: "uniformTypeIdentifier") as? String {
if imageType == kUTTypeGIF as String {
//enter code here
}
}
IOS 11以降、次のものを使用できると思います。
if asset.playbackStyle == .imageAnimated {
// try to show gif animation
}