Voici mon contrôle d'image. Je ne peux pas me fier aux extensions de fichiers et je dois vérifier le format par moi-même. Je charge les BitmapImages dans WPF à partir de tableaux d'octets et je ne connais pas le format à l'avance. WPF détecte bien le format mais ne vous indique pas le format d'image des objets BitmapImage (du moins, je ne connais pas de propriété pour cela). Et je ne veux pas recharger l'image avec System.Drawing uniquement pour détecter le format. Cette solution est rapide et fonctionne bien pour moi.
public enum ImageFormat
{
bmp,
jpeg,
gif,
tiff,
png,
unknown
}
public static ImageFormat GetImageFormat(byte[] bytes)
{
// see http://www.mikekunz.com/image_file_header.html
var bmp = Encoding.ASCII.GetBytes("BM"); // BMP
var gif = Encoding.ASCII.GetBytes("GIF"); // GIF
var png = new byte[] { 137, 80, 78, 71 }; // PNG
var tiff = new byte[] { 73, 73, 42 }; // TIFF
var tiff2 = new byte[] { 77, 77, 42 }; // TIFF
var jpeg = new byte[] { 255, 216, 255, 224 }; // jpeg
var jpeg2 = new byte[] { 255, 216, 255, 225 }; // jpeg canon
if (bmp.SequenceEqual(bytes.Take(bmp.Length)))
return ImageFormat.bmp;
if (gif.SequenceEqual(bytes.Take(gif.Length)))
return ImageFormat.gif;
if (png.SequenceEqual(bytes.Take(png.Length)))
return ImageFormat.png;
if (tiff.SequenceEqual(bytes.Take(tiff.Length)))
return ImageFormat.tiff;
if (tiff2.SequenceEqual(bytes.Take(tiff2.Length)))
return ImageFormat.tiff;
if (jpeg.SequenceEqual(bytes.Take(jpeg.Length)))
return ImageFormat.jpeg;
if (jpeg2.SequenceEqual(bytes.Take(jpeg2.Length)))
return ImageFormat.jpeg;
return ImageFormat.unknown;
}
3 votes
Pourquoi ne pas envelopper ce code dans un bloc try...catch, et s'il lève cette exception, vous pouvez le considérer comme "invalide" ? Certes, il s'agit d'une heuristique naïve, mais elle fait l'affaire. Toute autre méthode devra toujours ouvrir le fichier, donc vous ne gagnerez pas beaucoup en performances, selon moi.
0 votes
Voir aussi : stackoverflow.com/questions/9354747/
0 votes
Voir aussi, pour une méthode alternative : stackoverflow.com/q/2053662/2181514