Pergunta

Gostaria de preencher um array String com todas as imagens encontradas em um diretório.

Até agora eu uso o seguinte para obter todas as imagens em formato jpg

Dim List() as string = Directory.GetFiles(Path, "*.jpg")

Agora gostaria de estendê-lo e obter todos os formatos de imagem.

Posso usar o directory.GetFiles combinado com um "ImageFormat enumeração"?

Foi útil?

Solução

Olá, você pode usar isso que encontrei como conteúdo da comunidade em 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();
}

uma alternativa que usa avaliação lenta (somente .Net 4.0):

private static IEnumerable<string> GetFiles(string sourceFolder, string filters)
{
   return filters.Split('|').SelectMany(filter => System.IO.Directory.EnumerateFiles(sourceFolder, filter));
}

Você pode usá-lo como GetFiles("dir", "*.jpg|*.gif|*.jpeg|*.bmp|*.png").É essencialmente apenas uma pesquisa por cada filtro, por isso é não tão eficiente quanto possível.

Uma versão final é (é apenas .Net 4.0, mas pode ser transformada em uma solução 2.0 pelo menos):

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;
}

Acredito que o último seja o mais rápido porque só faz um loop uma vez.Mas isso depende de como a busca de padrões é implementada em Directory e como o sistema operacional pesquisa.É necessário um teste de desempenho que não fiz.

Outras dicas

Esta é a solução 2.0 .net.

Fiz algo semelhante em C#.Esta solução usou uma pasta como ponto de entrega para o processamento das imagens.Carregar cada tipo de arquivo como imagem não é a solução correta em todos os casos, mas eu queria validar cada arquivo como uma imagem carregável.

    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();
        }
    }

Acontece que esqueci um pedaço...Antes de processar os arquivos, usei uma função para limitar o processamento dos arquivos:

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top