2016-02-12 10 views
10

Nie mam pojęcia, dlaczego tak jest trudno. Próbuję określić typ pliku PHAsset, w szczególności chcę wiedzieć, czy dany zasób reprezentuje obraz GIF, czy nie.Jak prawidłowo wykryć typ pliku PHAsset (GIF)?

Wystarczy sprawdzania pliku składnika aktywów mówi mi, że jest to MP4:

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

Czy iOS konwertować filmy do GIF po zapisaniu się do biblioteki urządzenia zdjęciu? Próbowałem również pobrać dane obrazu i spojrzeć na to dataUTI, ale po prostu zwraca nil dla GIF-a (zakładam też wszystkie filmy). Ja ściągam dane obrazu w następujący sposób:

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 wrócił z powyższym wezwanie jest nil.

Jeśli ktoś wie o niezawodnym sposobie określania typu pliku PHAsset (szukam GIF-ów, ale możliwość określenia dowolnego typu pliku byłaby świetna), daj mi znać!

+0

prawda Znajdź odpowiedź? –

+0

znalazłeś odpowiedź? –

Odpowiedz

2

Po pierwsze, nie jestem pewien, co masz na myśli przez obraz GIF.
Czy masz na myśli Live Photo lub Time-Lapse?

Jednakże, jeśli chcesz sprawdzić aktualny zasób jest Live Photo, poklatkowy, można sprawdzić jak to

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

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

określania ogólny typ pliku o PHAsset, można sprawdzić

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

Ma na myśli obrazy w formacie .gif (obrazy animowane), a nie Zdjęcia na żywo lub Czas-lapses. .png, .jpg, .gif, .tiff są wszelkiego rodzaju obrazami. Zdjęcia na iOS mogą przechowywać gify, pyta, jak wykrywasz, czy obraz jest gifem, czy nie. –

7

Zastosowanie 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

Ponadto można znaleźć uniformTypeIdentifier z PHContentEditingInput klasie. Dla tego; używać requestContentEditingInput funkcji z PHAsset

Nie zapomnij MobileCoreServices na przywóz kUTTypeGif

Swift 3.1 Przykładowy kod:

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

Dla Swift 3.0 i powyżej

import MobileCoreServices 


var isGIFImage = false 
if let identifier = asset.value(forKey: "uniformTypeIdentifier") as? String 
{ 
    if identifier == kUTTypeGIF as String 
    { 
    isGIFImage = true 
    } 
} 
Powiązane problemy