Ajuste el filtro a un OpenFileDialog para permitir que los típicos formatos de imagen?

Tengo este código, ¿cómo puedo permitir a aceptar todos los típicos formatos de imagen? PNG, JPEG, JPG, GIF?

He aquí lo que tengo hasta ahora:

public void EncryptFile()
{            
    OpenFileDialog dialog = new OpenFileDialog();
    dialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
    dialog.InitialDirectory = @"C:\";
    dialog.Title = "Please select an image file to encrypt.";

    if (dialog.ShowDialog() == DialogResult.OK)
    {
        //Encrypt the selected file. I'll do this later. :)
    }             
}

Observe que la configuración del filtro .archivos txt. Yo podría cambio en PNG, pero lo de los otros tipos?

InformationsquelleAutor Sergio Tapia | 2010-01-15

11 Kommentare

  1. 272

    De el docs, la sintaxis del filtro que usted necesita es el siguiente:

    Office Files|*.doc;*.xls;*.ppt

    es decir, separar las múltiples extensiones con un punto y coma, por lo que, Image Files|*.jpg;*.jpeg;*.png;....

  2. 169

    Seguir este patrón, si la búsqueda para los archivos de imagen:

    dialog.Filter =  "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";
    • Probablemente quiere deshacerse de los espacios antes y después de que el carácter de canalización y entre el semi-colon y el asterisco en el filtro de la parte. Pero bueno, de lo contrario.
    • También puede agrupar cualquier tipo de archivo con el de esta manera. Bueno!
  3. 68

    He aquí un ejemplo de la ImageCodecInfo sugerencia (en VB):

       Imports System.Drawing.Imaging
            ...            
    
            Dim ofd as new OpenFileDialog()
            ofd.Filter = ""
            Dim codecs As ImageCodecInfo() = ImageCodecInfo.GetImageEncoders()
            Dim sep As String = String.Empty
            For Each c As ImageCodecInfo In codecs
                Dim codecName As String = c.CodecName.Substring(8).Replace("Codec", "Files").Trim()
                ofd.Filter = String.Format("{0}{1}{2} ({3})|{3}", ofd.Filter, sep, codecName, c.FilenameExtension)
                sep = "|"
            Next
            ofd.Filter = String.Format("{0}{1}{2} ({3})|{3}", ofd.Filter, sep, "All Files", "*.*")

    Y se parece a esto:

    Ajuste el filtro a un OpenFileDialog para permitir que los típicos formatos de imagen?

    • Las ventajas de este enfoque: se va a mantener con futuras adiciones de imagen soportados tipos .NET. Gracias
  4. 45

    Solución completa en C# está aquí:

    private void btnSelectImage_Click(object sender, RoutedEventArgs e)
    {
        //Configure open file dialog box 
        Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
        dlg.Filter = "";
    
        ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
        string sep = string.Empty;
    
        foreach (var c in codecs)
        {
           string codecName = c.CodecName.Substring(8).Replace("Codec", "Files").Trim();
           dlg.Filter = String.Format("{0}{1}{2} ({3})|{3}", dlg.Filter, sep, codecName, c.FilenameExtension);
           sep = "|";
        }
    
        dlg.Filter = String.Format("{0}{1}{2} ({3})|{3}", dlg.Filter, sep, "All Files", "*.*"); 
    
        dlg.DefaultExt = ".png"; //Default file extension 
    
        //Show open file dialog box 
        Nullable<bool> result = dlg.ShowDialog();
    
        //Process open file dialog box results 
        if (result == true)
        {
           //Open document 
           string fileName  = dlg.FileName;
           //Do something with fileName  
        }
    } 
  5. 22

    A filtrar imágenes de archivos, utilice este código de ejemplo.

    //Create a new instance of openFileDialog
    OpenFileDialog res = new OpenFileDialog();
    
    //Filter
    res.Filter = "Image Files|*.jpg;*.jpeg;*.png;*.gif;*.tif;...";
    
    //When the user select the file
    if (res.ShowDialog() == DialogResult.OK)
    {
       //Get the file's path
       var filePath = res.FileName;
       //Do something
       ....
    }
  6. 13

    Me gusta Tom Fausto de la respuesta de las mejores. He aquí una versión de C# de su solución, pero simplificando un poco las cosas.

    var codecs = ImageCodecInfo.GetImageEncoders(); 
    var codecFilter = "Image Files|"; 
    foreach (var codec in codecs) 
    {
        codecFilter += codec.FilenameExtension + ";"; 
    } 
    dialog.Filter = codecFilter;
  7. 9

    Para las imágenes, usted podría conseguir los códecs disponibles de GDI (del Sistema.El dibujo) y construir su lista de la que con un poco de trabajo. Esta sería la forma más flexible para ir.

    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
    • Gracias por este consejo! He añadido estos y trabajó como un encanto: var imageExtensions = string.Join(";", ImageCodecInfo.GetImageDecoders().Select(ici => ici.FilenameExtension)); dialog.Filter = string.Format("Images|{0}|All Files|*.*", imageExtensions);
    • ugh…no estoy seguro de cómo hacer multi-línea de bloques de código en un comentario 😐
    • No es el autor original 🙂
  8. 9

    Sólo un necrocomment para el uso de la cadena.Únete y LINQ.

    ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
    dlgOpenMockImage.Filter = string.Format("{0}| All image files ({1})|{1}|All files|*", 
        string.Join("|", codecs.Select(codec => 
        string.Format("{0} ({1})|{1}", codec.CodecName, codec.FilenameExtension)).ToArray()),
        string.Join(";", codecs.Select(codec => codec.FilenameExtension).ToArray()));
  9. 4

    Para aquellos que no quieren recordar la sintaxis de cada vez que aquí es un simple encapsulación:

    public class FileDialogFilter : List<string>
    {
        public string Explanation { get; }
    
        public FileDialogFilter(string explanation, params string[] extensions)
        {
            Explanation = explanation;
            AddRange(extensions);
        }
    
        public string GetFileDialogRepresentation()
        {
            if (!this.Any())
            {
                throw new ArgumentException("No file extension is defined.");
            }
    
            StringBuilder builder = new StringBuilder();
    
            builder.Append(Explanation);
    
            builder.Append(" (");
            builder.Append(String.Join(", ", this));
            builder.Append(")");
    
            builder.Append("|");
            builder.Append(String.Join(";", this));
    
            return builder.ToString();
        }
    }
    
    public class FileDialogFilterCollection : List<FileDialogFilter>
    {
        public string GetFileDialogRepresentation()
        {
            return String.Join("|", this.Select(filter => filter.GetFileDialogRepresentation()));
        }
    }

    Uso:

    FileDialogFilter filterImage = new FileDialogFilter("Image Files", "*.jpeg", "*.bmp");
    FileDialogFilter filterOffice = new FileDialogFilter("Office Files", "*.doc", "*.xls", "*.ppt");
    
    FileDialogFilterCollection filters = new FileDialogFilterCollection
    {
        filterImage,
        filterOffice
    };
    
    OpenFileDialog fileDialog = new OpenFileDialog
    {
        Filter = filters.GetFileDialogRepresentation()
    };
    
    fileDialog.ShowDialog();
  10. 3

    Con el fin de coincidir con una lista de las diferentes categorías de archivo, puede utilizar el filtro de la siguiente manera:

            var dlg = new Microsoft.Win32.OpenFileDialog()
            {
                DefaultExt = ".xlsx",
                Filter = "Excel Files (*.xls, *.xlsx)|*.xls;*.xlsx|CSV Files (*.csv)|*.csv"
            };
  11. 1

    Esto es extremo, pero he construido un dinámicas, base de datos impulsada por el uso de un filtro de 2 columna de la tabla de base de datos denominado FILE_TYPES, con los nombres de campo de la EXTENSIÓN y tipo de documento:

    ---------------------------------
    | EXTENSION  |  DOCTYPE         |
    ---------------------------------
    |   .doc     |  Document        |
    |   .docx    |  Document        |
    |   .pdf     |  Document        |
    |   ...      |  ...             |
    |   .bmp     |  Image           |
    |   .jpg     |  Image           |
    |   ...      |  ...             |
    ---------------------------------

    Obviamente había muchos diferentes tipos y extensiones, pero estoy simplificando para este ejemplo. Aquí es mi función:

        private static string GetUploadFilter()
        {
            //Desired format:
            //"Document files (*.doc, *.docx, *.pdf)|*.doc;*.docx;*.pdf|"
            //"Image files (*.bmp, *.jpg)|*.bmp;*.jpg|"
    
            string filter = String.Empty;
            string nameFilter = String.Empty;
            string extFilter = String.Empty;
    
            //Used to get extensions
            DataTable dt = new DataTable();
            dt = DataLayer.Get_DataTable("SELECT * FROM FILE_TYPES ORDER BY EXTENSION");
    
            //Used to cycle through doctype groupings ("Images", "Documents", etc.)
            DataTable dtDocTypes = new DataTable();
            dtDocTypes = DataLayer.Get_DataTable("SELECT DISTINCT DOCTYPE FROM FILE_TYPES ORDER BY DOCTYPE");
    
            //For each doctype grouping...
            foreach (DataRow drDocType in dtDocTypes.Rows)
            {
                nameFilter = drDocType["DOCTYPE"].ToString() + " files (";
    
                //... add its associated extensions
                foreach (DataRow dr in dt.Rows)
                {
                    if (dr["DOCTYPE"].ToString() == drDocType["DOCTYPE"].ToString())
                    {
                        nameFilter += "*" + dr["EXTENSION"].ToString() + ", ";
                        extFilter += "*" + dr["EXTENSION"].ToString() + ";";
                    }                    
                }
    
                //Remove endings put in place in case there was another to add, and end them with pipe characters:
                nameFilter = nameFilter.TrimEnd(' ').TrimEnd(',');
                nameFilter += ")|";
                extFilter = extFilter.TrimEnd(';');
                extFilter += "|";
    
                //Add the name and its extensions to our main filter
                filter += nameFilter + extFilter;
    
                extFilter = ""; //clear it for next round; nameFilter will be reset to the next DOCTYPE on next pass
            }
    
            filter = filter.TrimEnd('|');
            return filter;
        }
    
        private void UploadFile(string fileType, object sender)
        {            
            Microsoft.Win32.OpenFileDialog dlg = new Microsoft.Win32.OpenFileDialog();
            string filter = GetUploadFilter();
            dlg.Filter = filter;
    
            if (dlg.ShowDialog().Value == true)
            {
                string fileName = dlg.FileName;
    
                System.IO.FileStream fs = System.IO.File.OpenRead(fileName);
                byte[] array = new byte[fs.Length];
    
                //This will give you just the filename
                fileName = fileName.Split('\\')[fileName.Split('\\').Length - 1];
                ...

    Debe producir un filtro que se parece a esto:

    Ajuste el filtro a un OpenFileDialog para permitir que los típicos formatos de imagen?

    • Downvoter, cuidado de explicar? Usted tiene una mejor idea? A mí me funciona, como ya he demostrado, a través de un gráfico.
    • Filter="Document files (*.doc,*.docx,*.pdf)|*.doc;*.docx,*.pdf|Image files (*.bmp,*.jpg)|*.bmp;*.jpg"; y este debe producir un filtro que se parece a la última imagen en la respuesta anterior.
    • Si has mirado en mi respuesta, verías que yo ya tenía en el comentario al principio del código. Si no trabajan, yo no tendría el gráfico para demostrar que lo hace. Como he explicado, el código se toma los valores de una tabla de base de datos & concatena. Usted acaba de poner el tipo de documento («Documentos», «Imágenes», etc.) y la Extensión de 2 columnas en una tabla llamada «FILE_TYPES». Suponiendo que usted tenía una función llamada DataLayer.Get_DataTable() que llevaría a los comandos SQL que tengo en este código & enviar de vuelta un DataTable, que haría todo por ti. Como me dijo que sí, que era extremo, pero no funciona.
    • Sí. pero em… sólo el 10% de tu post es la respuesta directa a la pregunta. Otro 90% es información extra que no es necesario para resolver la cuestión. La pregunta no solicita información acerca de la obtención de datos de la base de datos y no preguntar acerca de concatena… y bla… bla…bla…. algunos de los más comandos SQL? … DataTable? ¿Por qué no incluir también la extracción de datos de Servicios Web… y demostrar cadena JSON de análisis.. o XML de datos de conversión para obtener los Tipos de Archivo? y también de NoSQL? y Javascript llamadas desde el extremo delantero para los Tipos de Archivo?…. no… lo que está fuera del tema.
    • Uno de los puntos, pero también para demostrar el poder de que foreach bucle en el medio. Usted podría tener TONELADAS de diferentes doctypes, y las extensiones dentro de ellos. Esto sirvió como una manera de organizarlos, a continuación, aplicar el código para obtener de ellos. Para mí, fue mejor de lo que acaba suponiendo que no fueron sólo 3 de cada uno y dando la concatenación de cadenas. Enseñar a un hombre a pescar….

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea