On peut également déterminer le type d'image sans se fondant sur l'extension du chemin avec CGImageSource (partie du cadre ImageIO).
L'exemple suivant utilise une URL de fichier, mais vous pouvez également créer une source d'image à partir d'un CFDataRef.
CFStringRef typeOfImageAtURL(NSURL *imageURL) {
const void * keys[] = { kCGImageSourceShouldCache };
const void * values[] = { kCFBooleanFalse };
CFDictionaryRef options = CFDictionaryCreate(kCFAllocatorDefault, keys, values, 1, NULL, NULL);
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((__bridge CFURLRef)imageURL, options);
CFStringRef imageType = CGImageSourceGetType(imageSource);
CFRelease(options);
CFRelease(imageSource);
return imageType;
}
La valeur de retour sera une constante que vous pouvez comparer avec les valeurs d'identificateur de type uniforme déclarées dans CoreServices/MobileCoreServices (par exemple, kUTTypeJPEG, kUTTypeGIF, etc). La cerise sur le gateau: vous pouvez passer un "hint" optionnel si vous avez des raisons d'anticiper un type de fichier ou un autre. Combinez cette approche avec Bavarious 'et vous aurez une machine de détection de format d'image maigre, moyenne.
C'était exactement ce que je cherchais. Merci! –
Si vous êtes comme moi et que vous rencontrez des problèmes pour obtenir l'extension de fichier conforme à la bonne UTI, assurez-vous de ne pas ajouter l'extension de fichier avec un point! Vous devriez passer "jpg" et PAS ".jpg"! – Will
Malheureusement, la vérification de l'UTI semble fonctionner uniquement avec certains types/fichiers vidéo. Cela fonctionne bien avec les conteneurs MP4 (par exemple), mais cela ne fonctionne pas avec les conteneurs MKV. 'UTTypeCreatePreferredIdentifierForTag' renvoie un type dynamique commençant par le préfixe' dyn' lorsqu'il ne trouve pas d'UTI approprié (donc pour MKV, par exemple). – Alex