Améliorer la situation réponse de wl. Si l'on ne peut pas prédire le type MIME de l'image, voici une méthode beaucoup plus étendue et précise pour prédire le type MIME de l'image à partir de la signature. Le code est largement inspiré de la fonction ext/standard/image.c .
- (NSString *)mimeTypeByGuessingFromData:(NSData *)data {
char bytes[12] = {0};
[data getBytes:&bytes length:12];
const char bmp[2] = {'B', 'M'};
const char gif[3] = {'G', 'I', 'F'};
const char swf[3] = {'F', 'W', 'S'};
const char swc[3] = {'C', 'W', 'S'};
const char jpg[3] = {0xff, 0xd8, 0xff};
const char psd[4] = {'8', 'B', 'P', 'S'};
const char iff[4] = {'F', 'O', 'R', 'M'};
const char webp[4] = {'R', 'I', 'F', 'F'};
const char ico[4] = {0x00, 0x00, 0x01, 0x00};
const char tif_ii[4] = {'I','I', 0x2A, 0x00};
const char tif_mm[4] = {'M','M', 0x00, 0x2A};
const char png[8] = {0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a};
const char jp2[12] = {0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a};
if (!memcmp(bytes, bmp, 2)) {
return @"image/x-ms-bmp";
} else if (!memcmp(bytes, gif, 3)) {
return @"image/gif";
} else if (!memcmp(bytes, jpg, 3)) {
return @"image/jpeg";
} else if (!memcmp(bytes, psd, 4)) {
return @"image/psd";
} else if (!memcmp(bytes, iff, 4)) {
return @"image/iff";
} else if (!memcmp(bytes, webp, 4)) {
return @"image/webp";
} else if (!memcmp(bytes, ico, 4)) {
return @"image/vnd.microsoft.icon";
} else if (!memcmp(bytes, tif_ii, 4) || !memcmp(bytes, tif_mm, 4)) {
return @"image/tiff";
} else if (!memcmp(bytes, png, 8)) {
return @"image/png";
} else if (!memcmp(bytes, jp2, 12)) {
return @"image/jp2";
}
return @"application/octet-stream"; // default type
}
La méthode ci-dessus reconnaît les types d'images suivants :
-
image/x-ms-bmp
(bmp)
-
image/gif
(gif)
-
image/jpeg
(jpg, jpeg)
-
image/psd
(psd)
-
image/iff
(si)
-
image/webp
(webp)
-
image/vnd.microsoft.icon
(ico)
-
image/tiff
(tif, tiff)
-
image/png
(png)
-
image/jp2
(jp2)
Malheureusement, il n'y a pas de moyen simple d'obtenir ce type d'information à partir d'une UIImage
car ses données bitmap encapsulées ne sont pas accessibles.
0 votes
Pourquoi avez-vous besoin de savoir ? Si l'UIImage l'affiche bien, je ne vois pas pourquoi vous ne pourriez pas le conserver sans l'extension.
1 votes
L'image sera également affichée sur un site web à l'avenir. Je constate maintenant que les navigateurs peuvent afficher correctement l'image brute (sans extension de fichier).