続・画像ファイルのパスを取得する - C#

前回の処理をもう少し見直してみる。

前回の処理では画像形式の種類を問わずファイルを取得しているので、特定のファイル形式のみを取得する処理にしたい。



取得したい画像形式を簡単に指定出来るようにしたいので引数として使用するenumを用意する。

[Flags]
public enum ImageTypeFlags
{
    BMP  = 1,
    EMF  = 1 << 1, //  2
    GIF  = 1 << 2, //  4
    ICO  = 1 << 3, //  8
    JPEG = 1 << 4, // 16
    PNG  = 1 << 5, // 32
    TIFF = 1 << 6, // 64
    WMF  = 1 << 7  //128
}


各画像形式には複数の拡張子が存在するのでその拡張子を直に取り出せるようにImageTypeFlagsをKeyにしたDictionaryを作成する。
Dictionary<ImageTypeFlags, string[]> extDict = ImageCodecInfo
    .GetImageDecoders()
    .ToDictionary(
        ici => (ImageTypeFlags)Enum.Parse(typeof(ImageTypeFlags),
            ici.FormatDescription, true),
        ici => ici.FilenameExtension.Split(';'));
ここで一つ問題がある。
ImageTypeFlagsの列挙子と上で取得するFormatDescriptionとが必ず一致する保証がない。
現在の.NET Frameworkのバージョンでは問題なく動作するが、今後サポートする画像形式が変更される可能性は決してゼロではないため、これについての対処がされていないという意味でちぃとマズイかも...

以下が本体。
string[] GetImageFiles(string root, SearchOption so)
{
    return GetImageFiles(root, so, (ImageTypeFlags)0xff); //255 = All
}

string[] GetImageFiles(
    string root, SearchOption so, ImageTypeFlags imgTypeFlags)
{
    IEnumerable<string> imgFiles = new string[0];

    foreach (ImageTypeFlags flg in Enum.GetValues(typeof(ImageTypeFlags)))
    {
        if ((imgTypeFlags & flg) != 0)
        {
            foreach (string sp in extDict[flg])
            {
                imgFiles = imgFiles.Concat(Directory.GetFiles(root, sp, so));
            }
        }
    }

    return imgFiles.ToArray();
}
ImageTypeFlags.Allがあった方が良かったかもしれないが、あるとそれに関する余計な処理が増えるので省き、メソッドのオーバーロードで対応した。


Usage
//JpegファイルとBitmapファイルを取得します。
string[] s = GetImageFiles(
    Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
    SearchOption.AllDirectories,
    ImageTypeFlags.JPEG | ImageTypeFlags.BMP);
これで簡単に画像ファイルのパスを取得できる。

0 Comments:

Sony Style(ソニースタイル)
デル株式会社

Recent Posts