Trouver type d'image à partir de NSData ou UIImage
Je suis de chargement d'une image à partir d'une URL fournie par un tiers. Il n'y a pas d'extension de fichier (ou un nom de fichier pour cette question) sur l'URL (comme c'est un obscurci URL). Je peux prendre les données de cette (sous la forme de NSData) et de le charger dans une UIImage et l'afficher à l'amende.
J'ai besoin d'enregistrer ces données dans un fichier. Cependant, je ne sais pas ce format de données est dans (PNG, JPG, BMP)? Je suppose que c'est en JPG (puisque c'est une image à partir du web), mais est-il un moyen via un programme de trouver? J'ai regardé autour de StackOverflow et à la documentation et n'ont pas été en mesure de trouver quoi que ce soit.
TIA.
Edit: ai-je vraiment besoin de l'extension de fichier? Je suis la persistance à un stockage externe (Amazon S3), mais étant donné qu'il sera toujours utilisé dans le contexte d'iOS ou d'un navigateur (qui semblent bien dans l'interprétation des données sans extension) c'est peut-être un non-problème.
- Pourquoi avez-vous besoin de savoir? Si le UIImage afficher amende, je ne vois pas de raison pourquoi ne pouvez-vous pas persister sans l'extension.
- L'image sera aussi affiché sur un site web dans le futur. Je ne vois, maintenant, que les navigateurs peuvent afficher l'image raw (sans extension de fichier) correctement.
Vous devez vous connecter pour publier un commentaire.
Si vous avez NSData pour le fichier image, puis vous pouvez deviner le type de contenu en regardant le premier octet:
De l'amélioration wl.'s réponse, voici une beaucoup plus longue et précise pour prédire l'image du type MIME basée sur la signature. Le code a été largement inspirée par php ext/standard/image.c.
La méthode ci-dessus reconnaît les types d'image suivants:
image/x-ms-bmp
(bmp)image/gif
(gif)image/jpeg
(jpg, jpeg)image/psd
(psd)image/iff
(iff)image/webp
(webp)image/vnd.microsoft.icon
(ico)image/tiff
(tif, tiff)image/png
(png)image/jp2
(jp2)Malheureusement, il n'existe pas de moyen simple d'obtenir ce genre d'information à partir d'un
UIImage
exemple, car son encapsulé données de l'image ne peut pas être consulté.@Tai Le la solution Swift 3 est l'assignation de l'ensemble des données dans le tableau d'octets. Si une image de grande taille, il peut causer des crash. Cette solution attribue seul octet:
Si vous êtes à la récupération de l'image à partir d'une URL, alors probablement que vous pouvez inspecter la-têtes de réponse HTTP. Le
Content-Type
en-tête contiennent quelque chose d'utile? (J'imagine qu'il serait depuis un navigateur serait probablement en mesure d'afficher correctement l'image, et il ne peut le faire que si le type de contenu ont été correctement réglé)Swift3 version:
Si c'est vraiment important pour vous, je crois que vous aurez à examiner la bytestream. Un JPEG allons commencer avec les octets FF D8. Un PNG allons commencer avec 89 50 4E 47 0D 0A 1A 0A. Je ne sais pas si BMP a un en-tête similaire, mais je ne pense pas que vous êtes trop de chances sur le web en 2010.
Mais est-ce vraiment important pour vous? Ne pouvez-vous pas juste le traiter comme une inconnue de l'image et de laisser Cocoa Touch faire le travail?
Une alternative de accepté de répondre est la vérification de l'image de l'UTI avec
image I/O frameWork
. Vous pouvez obtenir une image de type " formulaire d'infection urinaire.essayez ceci:
Par exemple, une image GIF de l'UTI est "com.compuserve.gif" et PNG image de l'UTI est "public.png".MAIS vous ne pouvez pas réaliser UTI à partir de l'image qui
image I/O frameWork
n'est pas reconnu.Mettre en œuvre une signature de vérifier pour chaque format d'image. Voici un rapide Objective-C fonction qui fait que pour PNG de données:
J'ai fait une bibliothèque pour vérifier le type d'image de NSData:
https://github.com/sweetmandm/ImageFormatInspector