Pregunta

Me gustaría conseguir llenar una matriz de Cadena con todas las imágenes que se encuentran dentro de un directorio.

Hasta ahora yo uso el siguiente para obtener todas las imágenes con formato jpg

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

Ahora me gustaría extenderlo y conseguir todos los formatos de imagen.

¿Puedo utilizar el directorio.GetFiles combinado con un "ImageFormat enumeración"?

¿Fue útil?

Solución

Hola puedes usar este que he encontrado como contenido de la comunidad en 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();
}

una alternativa que utiliza la evaluación diferida (.Net 4.0):

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

Se puede utilizar como GetFiles("dir", "*.jpg|*.gif|*.jpeg|*.bmp|*.png").Es esencialmente una búsqueda para cada filtro, por lo que es no tan eficiente como se puede conseguir.

La versión final es (es .Net 4.0, pero se puede hacer a un 2.0 de la solución de al 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;
}

Creo que la última es la más rápida, ya que sólo los bucles de una vez.Pero esto depende de cómo el patrón de búsqueda es implementado en Directory y cómo el sistema operativo de búsqueda.Una prueba de rendimiento es necesario que no he hecho.

Otros consejos

Esta es la solución 2.0 .NET.

Hice algo similar en C #.Esta solución utilizó una carpeta como un punto de entrega para que las imágenes se procesen.Cargar cada tipo de archivo Como una imagen no es una solución correcta en todos los casos, pero quería validar cada archivo como una imagen cargable.

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

resulta que olvidé una pieza ... Antes de procesar los archivos, usé una función para limitar los archivos que se procesan:

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top