2016-02-12 9 views
10

का सही ढंग से पता लगाने के लिए मुझे नहीं पता कि यह इतना कठिन क्यों है। मैं एक PHAsset के फ़ाइल प्रकार को निर्धारित करने की कोशिश कर रहा हूं, विशेष रूप से, मैं जानना चाहता हूं कि कोई दी गई संपत्ति एक जीआईएफ छवि का प्रतिनिधित्व करती है या नहीं।PHAsset के फ़ाइल प्रकार (जीआईएफ)

सीधे शब्दों में संपत्ति के फ़ाइल नाम का निरीक्षण बताता है मुझे यह एक MP4 है:

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

आईओएस वीडियो के लिए GIF के परिवर्तित करता है जब उपकरणों छवि लाइब्रेरी में सहेजी गई? मैंने छवि के डेटा को लाने और इसे डेटाUTI को देखने का भी प्रयास किया है, लेकिन यह जीआईएफ के लिए 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 फ़ाइल प्रकार निर्धारित करने के लिए विश्वसनीय तरीके से जानता है (मैं विशेष रूप से जीआईएफ की तलाश कर रहा हूं, लेकिन किसी भी प्रकार की फ़ाइल के लिए निर्धारित करने में सक्षम होना अच्छा होगा) मुझे बताएं!

+0

तुमने किया था उत्तर ढूंढो? –

+0

क्या आपको कोई जवाब मिला? –

उत्तर

2

सबसे पहले, मुझे यकीन नहीं है कि जीआईएफ छवि का क्या मतलब है।
क्या आप लाइव फोटो या टाइम-विलंब का जिक्र कर रहे हैं?

हालांकि, अगर आप वर्तमान संपत्ति की जांच करने के है लाइव फोटो, समय चूक, तो आप इस

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

वह उन छवियों का अर्थ है जो एक .gif प्रारूप (एनिमेटेड छवियों) में हैं, लाइव फ़ोटो या समय-अंतराल नहीं। .png, .jpg, .gif, .tiff सभी प्रकार की छवियां हैं। आईओएस पर तस्वीरें gifs स्टोर कर सकती हैं, वह पूछ रहा है कि कोई छवि एक gif है या नहीं, तो आप कैसे पता लगा सकते हैं। –

7

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; 
     } 
    }]; 
3

इसके अलावा, आप PHContentEditingInput वर्ग से uniformTypeIdentifier पा सकते हैं। इसके लिए; PHAsset

से requestContentEditingInput फ़ंक्शन का उपयोग

kUTTypeGif

के लिए आयात MobileCoreServices के लिए मत भूलना

नमूना स्विफ्ट 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") 
      } 

     } 
    } 
1

स्विफ्ट 3.0 के लिए और ऊपर

import MobileCoreServices 


var isGIFImage = false 
if let identifier = asset.value(forKey: "uniformTypeIdentifier") as? String 
{ 
    if identifier == kUTTypeGIF as String 
    { 
    isGIFImage = true 
    } 
} 
संबंधित मुद्दे