2016-02-12 15 views
10

Non ho idea del perché sia ​​così difficile. Sto provando a determinare il tipo di file di un set PHA, in particolare, voglio sapere se una determinata risorsa rappresenta o meno un'immagine GIF.Come rilevare correttamente un tipo di file PHAsset (GIF)

Semplicemente ispezionare nome del bene mi dice che è un MP4:

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

Does iOS convertire GIF per i video quando salvato la libreria di immagini dispositivi? Ho anche provato a recuperare i dati dell'immagine e a guardarli è dataUTI, ma restituisce solo nil per GIF (sto assumendo anche tutti i video). Sto recupero i dati dell'immagine come segue:

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); 
     }); 

    }]; 

}); 

il dataUTI restituito dalla chiamata sopra è nil.

Se qualcuno conosce un metodo affidabile per determinare il tipo di file di PHAsset (sono specificamente alla ricerca di GIF, ma essere in grado di determinare per qualsiasi tipo di file sarebbe fantastico) fatemi sapere!

+0

avete fatto trova una risposta? –

+0

hai trovato una risposta? –

risposta

2

Prima di tutto, non sono sicuro di cosa intendi con l'immagine GIF.
Ti riferisci a Live Photo o Time-lapse?

Tuttavia, se si desidera controllare l'attività corrente viene Live Photo, Time-lapse, allora è possibile verificare come questo

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

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

per determinare il tipo di file generico di un PHAsset, è possibile controllare

asset.mediaType == PHAssetMediaTypeImage 
    asset.mediaType == PHAssetMediaTypeVideo 
    asset.mediaType == PHAssetMediaTypeAudio 
+2

Significa immagini in formato .gif (immagini animate), non in Live Photos o time-lapse. .png, .jpg, .gif, .tiff sono tutti i tipi di immagini. Le foto su iOS possono archiviare gif, chiede come si rileva se un'immagine è una gif o meno. –

7

Utilizzare 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

Inoltre si possono trovare uniformTypeIdentifier da PHContentEditingInput classe. Per questo; utilizzare requestContentEditingInput funzione da PHAsset

Non dimenticare di MobileCoreServices importazione per kUTTypeGif

Esempio Codice 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") 
      } 

     } 
    } 
1

per SWIFT 3.0 e versioni successive

import MobileCoreServices 


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