23

私はこのファイルタイプのフィルターを持っています:

    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: .NET またはそのための無料ライブラリに既定のフィルターはありますか?

文字列が画像かどうかをチェックする静的メソッドが必要です。これをどのように解決しますか?

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

Jeroen Vannevel EndsWith を使用したソリューション。大丈夫だと思います。

    public static bool IsImageExtension(string ext)
    {
        return imagesTypes.Contains(ext);
    }
4

5 に答える 5

16
private static readonly string[] _validExtensions = {"jpg","bmp","gif","png"}; //  etc

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

再コンパイルせずに実行時にリストを構成可能にしたい場合は、次のようなものを追加します。

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());
}
于 2013-07-19T05:38:08.277 に答える
5

このメソッドは、 のフィルタを自動的に作成しますOpenFileDialog。Windows でサポートされているイメージ デコーダーの情報を使用します。また、「不明な」画像形式の情報も追加します (ステートメントdefaultのケースを参照)。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();
}

次のように使用します。

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

上記のコード (少し変更されています) を使用して、利用可能な画像ファイルの拡張子を見つけることができます。特定のファイル拡張子が画像を示しているかどうかをテストするために、有効な拡張子をHashSet. HashSet の
アクセス時間は O(1) です。大文字と小文字を区別しない文字列比較子を選択してください。ファイル拡張子にはアクセント付きの文字や非ラテン文字が含まれていないため、カルチャは無視しても問題ありません。したがって、序数文字列比較を使用します。

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

ファイル名が画像かどうかをテストします。

string extension = Path.GetExtension(filename);
bool isImage = imageExtensions.Contains(extension);
于 2014-02-17T17:35:23.043 に答える
5

オプションは、可能なすべての有効な画像拡張子のリストを持つことです。その場合、そのメソッドは、指定された拡張子がそのコレクション内にあるかどうかのみを確認します。

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

次に、検証でそれに対してチェックします:

public static bool IsImageExtension(string ext)
{
    return validExtensions.Contains(ext);
}
于 2013-07-19T00:28:07.183 に答える