Une bonne façon de vérifier si l'extension de fichier est une image ou pas

j'ai ce type de fichiers filtres:

    public const string Png = "PNG Portable Network Graphics (*.png)|" + "*.png";
    public const string Jpg = "JPEG File Interchange Format (*.jpg *.jpeg *jfif)|" + "*.jpg;*.jpeg;*.jfif";
    public const string Bmp = "BMP Windows Bitmap (*.bmp)|" + "*.bmp";
    public const string Tif = "TIF Tagged Imaged File Format (*.tif *.tiff)|" + "*.tif;*.tiff";
    public const string Gif = "GIF Graphics Interchange Format (*.gif)|" + "*.gif";
    public const string AllImages = "Image file|" + "*.png; *.jpg; *.jpeg; *.jfif; *.bmp;*.tif; *.tiff; *.gif";
    public const string AllFiles = "All files (*.*)" + "|*.*";

    static FilesFilters()
    {
        imagesTypes = new List<string>();
        imagesTypes.Add(Png);
        imagesTypes.Add(Jpg);
        imagesTypes.Add(Bmp);
        imagesTypes.Add(Tif);
        imagesTypes.Add(Gif);
   }

OBS: y a-t-il des filtres par défaut dans .NET ou une bibliothèque libre pour cela?

j'ai besoin d'une méthode statique qui vérifie si une chaîne est une image ou pas. comment résoudre cela?

    //ext == Path.GetExtension(yourpath)
    public static bool IsImageExtension(string ext)
    {
        return (ext == ".bmp" || .... etc etc...)
    }

Solution utilisant Jeroen Vannevel EndsWith. Je pense que c'est ok.

    public static bool IsImageExtension(string ext)
    {
        return imagesTypes.Contains(ext);
    }
20
demandé sur Pedro77 2013-07-19 04:17:41

4 réponses

vous pouvez utiliser .endsWith(ext) . Ce n'est pas une méthode sûre cependant: je pourrais renommer " bla.jpg' à 'bla.png' et ce serait toujours un fichier jpg.

public static bool HasImageExtension(this string source){
 return (source.EndsWith(".png") || source.EndsWith(".jpg"));
}

Ce fournit une solution plus sécurisée:

string InputSource = "mypic.png";
System.Drawing.Image imgInput = System.Drawing.Image.FromFile(InputSource);
Graphics gInput = Graphics.fromimage(imgInput);
Imaging.ImageFormat thisFormat = imgInput.rawformat;
14
répondu Jeroen Vannevel 2017-11-24 10:49:52
private static readonly string[] _validExtensions = {"jpg","bmp","gif","png"}; //  etc

public static bool IsImageExtension(string ext)
{
    return _validExtensions.Contains(ext.ToLower());
}

si vous voulez pouvoir configurer la liste à l'exécution sans recompiler, ajoutez quelque chose comme:

private static string[] _validExtensions;

private static string[] ValidExtensions()
{
    if(_validExtensions==null)
    { 
        // load from app.config, text file, DB, wherever
    }
    return _validExtensions
}

public static bool IsImageExtension(string ext)
{
    return ValidExtensions().Contains(ext.ToLower());
}
13
répondu nathanchere 2018-03-31 02:03:31

Cette méthode crée automatiquement un filtre pour le OpenFileDialog . Il utilise les informations des décodeurs d'image supportés par Windows. Il ajoute également des informations de formats d'image" inconnus "(voir default cas de la déclaration switch ).

private static string SupportedImageDecodersFilter()
{
    ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();

    string allExtensions = encoders
        .Select(enc => enc.FilenameExtension)
        .Aggregate((current, next) => current + ";" + next)
        .ToLowerInvariant();
    var sb = new StringBuilder(500)
        .AppendFormat("Image files  ({0})|{1}", allExtensions.Replace(";", ", "),
                      allExtensions);
    foreach (ImageCodecInfo encoder in encoders) {
        string ext = encoder.FilenameExtension.ToLowerInvariant();
        // ext = "*.bmp;*.dib;*.rle"           descr = BMP
        // ext = "*.jpg;*.jpeg;*.jpe;*.jfif"   descr = JPEG
        // ext = "*.gif"                       descr = GIF
        // ext = "*.tif;*.tiff"                descr = TIFF
        // ext = "*.png"                       descr = PNG

        string caption;
        switch (encoder.FormatDescription) {
            case "BMP":
                caption = "Windows Bitmap";
                break;
            case "JPEG":
                caption = "JPEG file";
                break;
            case "GIF":
                caption = "Graphics Interchange Format";
                break;
            case "TIFF":
                caption = "Tagged Image File Format";
                break;
            case "PNG":
                caption = "Portable Network Graphics";
                break;
            default:
                caption = encoder.FormatDescription;
                break;
        }
        sb.AppendFormat("|{0}  ({1})|{2}", caption, ext.Replace(";", ", "), ext);
    }
    return sb.ToString();
}

utilisez - le comme ceci:

var dlg = new OpenFileDialog {
    Filter = SupportedImageDecodersFilter(),
    Multiselect = false,
    Title = "Choose Image"
};

le code ci-dessus (légèrement modifié) peut être utilisé pour trouver des extensions de fichier image disponibles. Afin de tester si un étant donné que l'extension de fichier dénote une image, je mettrais l'extension valide dans un HashSet . HashSets ont un

O(1) temps d'accès! Assurez-vous de choisir une chaîne casse comparer. Comme les extensions de fichiers ne contiennent pas de lettres accentuées ou non latines, la culture peut être ignorée en toute sécurité. Par conséquent, j'utilise une comparaison de chaîne ordinale.

var imageExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
imageExtensions.Add(".png");
imageExtensions.Add(".bmp");
...

et tester si un nom de fichier est une image:

string extension = Path.GetExtension(filename);
bool isImage = imageExtensions.Contains(extension);
5
répondu Olivier Jacot-Descombes 2016-08-23 19:21:14

une option serait d'avoir une liste de toutes les extensions d'image valides possibles, alors cette méthode vérifierait seulement si l'extension fournie est dans cette collection:

private static readonly HashSet<string> validExtensions = new HashSet<string>()
{
    "png",
    "jpg",
    "bmp"
    // Other possible extensions
};

puis dans la validation vous venez de vérifier que:

public static bool IsImageExtension(string ext)
{
    return validExtensions.Contains(ext);
}
4
répondu Alejandro 2013-07-19 00:28:07