Tipik görüntü formatlarına izin vermek için filtreyi bir OpenFileDialog olarak mı ayarlıyorsunuz?


229

Bu kod var, nasıl tüm tipik görüntü biçimlerini kabul izin verebilirim? PNG, JPEG, JPG, GIF?

Şimdiye kadar sahip olduğum şey:

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. :)
    }             
}

Filtrenin .txt dosyalarına ayarlandığına dikkat edin. Ben olabilir PNG değiştiremez ama başka tür?

Yanıtlar:


289

Gönderen docs aşağıdaki gibi gerektiğini filtre sözdizimi:

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

yani çoklu uzantıları noktalı virgülle ayırın - böylece Image Files|*.jpg;*.jpeg;*.png;...,.


179

Görüntü dosyalarına göz atıyorsanız bu kalıbı izleyin:

dialog.Filter =  "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";

6
Muhtemelen boru karakterinden önce ve sonra ve filtre bölümünde yarı kolon ve yıldız işareti arasındaki boşluklardan kurtulmak istersiniz. Ama iyi, aksi halde.
vapcguy

Ayrıca herhangi bir dosya türünü bu yolla gruplayabilirsiniz. Güzel!
Alper

74

ImageCodecInfo önerisinin bir örneği (VB'de):

   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", "*.*")

Ve şöyle görünüyor:

resim açıklamasını buraya girin


Bu yaklaşımın avantajı: gelecekte gelecekte desteklenen resim türlerinin eklenmesine ayak uyduracaktır. Thanks
UuDdLrLrSs

Bunu o kadar çok seviyorum ki, onu dünyanın en iğrenç tek-astarına dönüştürdüm! Dim ofd As New OpenFileDialog() With {.Filter = ImageCodecInfo.GetImageEncoders().Aggregate("All Files (*.*)|*.*", Function(s, c) $"{s}|{c.CodecName.Substring(8).Replace("Codec", "Files").Trim()} ({c.FilenameExtension})|{c.FilenameExtension}")}Ah evet. VB, bazen seni özlüyorum
Westonsupermare

46

C # ile komple çözüm burada:

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

23

Görüntü dosyalarını filtrelemek için bu kod örneğini kullanın.

//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
   ....
}

14

Tom Faust'un en iyi cevabını seviyorum. İşte çözümünün bir C # sürümü, ancak işleri biraz basitleştiriyor.

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

11

Görüntüler için GDI'dan (System.Drawing) mevcut codec bileşenlerini alabilir ve küçük bir çalışma ile listenizi oluşturabilirsiniz. Bu en esnek yol olacaktır.

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

5
Bu ipucu için teşekkürler! Bunları ekledim ve bir cazibe gibi çalıştı: var imageExtensions = string.Join(";", ImageCodecInfo.GetImageDecoders().Select(ici => ici.FilenameExtension)); dialog.Filter = string.Format("Images|{0}|All Files|*.*", imageExtensions);
atlantis

ugh ... bir satırda çok satırlı kod blokları nasıl emin değilim: |
atlantis

1
Orijinal yazar değil :)
atlantis

9

Sadece string kullanmak için bir necrocomment.Join ve 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()));

4

Burada her zaman sözdizimini hatırlamak istemeyenler için basit bir kapsülleme:

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

Kullanımı:

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

3

Farklı dosya kategorilerinin bir listesini eşleştirmek için filtreyi şu şekilde kullanabilirsiniz:

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

1

Bu aşırı, ancak alan adları EXTENSION ve DOCTYPE ile, 2 sütun veritabanı tablo FILE_TYPES kullanarak dinamik, veritabanına dayalı bir filtre inşa:

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

Açıkçası birçok farklı tip ve uzantıya sahibim, ancak bu örnek için basitleştiriyorum. İşte benim işlevi:

    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];
            ...

Şuna benzeyen bir filtre vermelidir:

resim açıklamasını buraya girin


Downvoter, açıklamak ister misin? Daha iyi bir fikrin mi var? Benim bir grafikte gösterdiğim gibi maden çalışıyor.
vapcguy

2
Filter="Document files (*.doc,*.docx,*.pdf)|*.doc;*.docx,*.pdf|Image files (*.bmp,*.jpg)|*.bmp;*.jpg";ve bu, yukarıdaki yanıttaki son resme benzeyen bir filtre vermelidir.
mjb

@mjb Cevabıma baksaydınız, kodun üst kısmındaki yorumda bunu zaten gördüm. Eğer işe yaramazsa, kanıtladığını gösteren grafiğe sahip olmazdım. Açıkladığım gibi, kod bir veritabanı tablosundan değerler alır ve bunları birleştirir. Belgeyi ("Belgeler", "Resimler" vb.) Ve Uzantıyı "FILE_TYPES" adlı bir tabloya 2 sütun olarak koyacaksınız. DataLayer.Get_DataTable()Bu koddaki SQL komutlarını alıp size bir DataTable'ı geri gönderecek bir fonksiyonunuz olduğunu varsayarsak, sizin için her şeyi yapar. Dediğim gibi, evet, aşırı, ama işe yarıyor.
vapcguy

Evet. ama em ... yayınınızın sadece% 10'u soruya doğrudan cevaptır. Diğer% 90'ı soruyu çözmek için gerekli olmayan ekstra bilgilerdir. Soru veritabanından veri alma hakkında bilgi talep etmez ve bitiştirilmiş ... ve bla ... bla ... bla .... hakkında soru sormadı biraz daha SQL komutları? ... Veri tablosu? Neden Web Hizmetlerinden veri almayı da dahil etmiyorsunuz ve Dosya Türlerini almak için JSON dize ayrıştırma .. veya XML veri dönüşümünü göstermiyorsunuz? ve ayrıca NoSQL'den mi? ve Javascript Dosya Türleri için ön uçtan arka uca çağırabiliyor mu? .... hayır ... bu konu dışı.
mjb

mjb Alınan nokta, ama aynı zamanda foreachortadaki o halkanın gücünü göstermek . Tonlarca farklı doktipe ve bunların içinde uzantılara sahip olabilirsiniz. Bu, onları organize etmenin bir yolu olarak hizmet etti, ardından almak için kod uygulayın. Benim için, sadece her birinin 3 olduğunu varsaymak ve birleştirme dizesi vermek daha iyiydi. Balık adam öğretmek
vapcguy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.