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

画像ファイルのパスを取得するために、.NETで扱える画像の種類を取得する方として、他にも色々あるかもしれないが、私はこのようにする。



まず、ファイルのパスを取得するメソッドであるDirectory.GetFilesの引数のサーチパターンとして使用するものを用意する。

string[] IMAGE_SEARCH_PATTERN_ALL = ImageCodecInfo
    .GetImageDecoders()
    .Select(ici => ici.FilenameExtension.Split(';'))
    .Aggregate((current, next) => current.Concat(next).ToArray());

これを出力すると以下になる。
*.BMP
*.DIB
*.RLE
*.JPG
*.JPEG
*.JPE
*.JFIF
*.GIF
*.EMF
*.WMF
*.TIF
*.TIFF
*.PNG
*.ICO

これを使用した画像ファイルのパスを取得するメソッドを書いてみる。

string[] GetImageFiles1(string root, SearchOption so)
{
    List<string> imgFileList = new List<string>();

    foreach (string ext in IMAGE_SEARCH_PATTERN_ALL)
    {
        imgFileList.AddRange(Directory.GetFiles(root, ext, so));
    }

    return imgFileList.ToArray();
}
因みにDirectory.GetFilesは大文字と小文字を区別しない。
つまり、「jpg」も「JPG」も「Jpg」も拾う。


これを少し見直してみる。
Listを使うと少々処理が遅くなるので、これを使わない方法で書いてみる。
string[] GetImageFiles2(string root, SearchOption so)
{
    IEnumerable<string> imgFiles = new string[0];

    foreach (string ext in IMAGE_SEARCH_PATTERN_ALL)
    {
        imgFiles = imgFiles.Concat(Directory.GetFiles(root, ext, so));
    }

    return imgFiles.ToArray();
}

Listではなく、IEnumerableにしてConcatで配列をまとめているのだが、処理時間を計測するとIEnumerableを使用した方が若干だが速い。
こちらの方が低レベルな処理ということなのかな?

0 Comments:

Recent Posts