Directory.GetAllImageFiles私はどのようにそれをするべきですか?
-
12-11-2019 - |
質問
ディレクトリ内にあるすべての画像を含む文字列配列を入力したいと思います。
今まで私は以下を使ってJPG形式ですべての画像を入手します
Dim List() as string = Directory.GetFiles(Path, "*.jpg")
.
今、私はそれを拡張してすべての画像フォーマットを手に入れたいです。
「ImageFormat
列挙」と組み合わせたDirectory.getFilesを使用できますか?
解決
こんにちはあなたは私がコミュニティコンテンツとして見つけたものを使うことができます http://msdn.microsoft.com/en-us/library/wz42302f.aspx 。:
private static string[] GetFiles(string sourceFolder, string filters)
{
return filters.Split('|').SelectMany(filter => System.IO.Directory.GetFiles(sourceFolder, filter)).ToArray();
}
.
遅延評価を使用する代替案(.NET 4.0のみ):
private static IEnumerable<string> GetFiles(string sourceFolder, string filters)
{
return filters.Split('|').SelectMany(filter => System.IO.Directory.EnumerateFiles(sourceFolder, filter));
}
.
GetFiles("dir", "*.jpg|*.gif|*.jpeg|*.bmp|*.png")
のように使用できます。それは本質的に各フィルタのほんの検索であるので、それが得ることができるほど効率的な効率的なものとしてではありません。
最終版は(少なくとも2.0ソリューションにすることができるが、少なくとも2.0ソリューションにすることができる):
.
private static IEnumerable<string> GetImageFiles(string sourceFolder)
{
return from file in System.IO.Directory.EnumerateFiles(sourceFolder)
let extension = Path.GetExtension(file)
where extension == ".jpg" || extension == ".gif" || extension == ".png"
select file;
}
私は一度だけループしかループしないので最後のものが最速であると思います。ただし、これは、Pattern SearchがDirectory
でどのように実装されているか、およびOSの検索方法によって異なります。私が行っていないパフォーマンステストが必要です。
他のヒント
これは2.0 .NETソリューションです。
C#で似たようなことをしました。この解決策では、処理対象の画像のドロップオフポイントとしてフォルダを使用しました。イメージとして各タイプのファイルをロードすると、すべての場合でも正しいソリューションではありませんが、ロード可能なイメージとして各ファイルを検証したいと思いました。
string[] files = Directory.GetFiles(folderPath);
foreach(string file in files)
{
System.Drawing.Image img = null;
try
{
img = System.Drawing.Image.FromFile(file);
}
catch
{
// do nothing
}
if (img != null)
{
// did something
img.Dispose();
}
}
.
が判明しました。 ファイルを処理する前に、処理中のファイルを制限する機能を使用しました。
private bool IsImage(FileInfo file)
{
bool imageFile = false;
if ((file.Extension.ToLower() ==".jpg")||
(file.Extension.ToLower() ==".gif")||
(file.Extension.ToLower() == ".bmp") ||
(file.Extension.ToLower() ==".png"))
{
imageFile = true;
}
return imageFile;
}
.