एक OpenFileDialog में फिल्टर को सेट करना विशिष्ट छवि प्रारूपों की अनुमति देता है?


229

मेरे पास यह कोड है, मैं इसे सभी विशिष्ट छवि प्रारूपों को स्वीकार करने की अनुमति कैसे दे सकता हूं? PNG, JPEG, JPG, GIF?

यहाँ मेरे पास अभी तक क्या है:

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

ध्यान दें कि फ़िल्टर .txt फ़ाइलों पर सेट है। मैं पीएनजी में बदल सकता हूं , लेकिन अन्य प्रकार के क्या?

जवाबों:


289

से डॉक्स , इस प्रकार फिल्टर वाक्य रचना कि आप की आवश्यकता है:

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

एक अर्धविराम के साथ कई एक्सटेंशन को अलग करें - इस प्रकार Image Files|*.jpg;*.jpeg;*.png;...,।


179

यदि आप छवि फ़ाइलों के लिए ब्राउज़ करते हैं तो इस पैटर्न का पालन करें:

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

6
संभवतः पाइप चरित्र के पहले और बाद के रिक्त स्थान से और फ़िल्टर भाग में अर्ध-बृहदान्त्र और तारांकन के बीच से छुटकारा पाना चाहते हैं। लेकिन अच्छा है, अन्यथा।
वाप्गुगी

आप इस तरह से किसी भी फ़ाइल प्रकार को समूहित कर सकते हैं। अच्छा!
Alper

74

यहाँ ImageCodecInfo सुझाव (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", "*.*")

और यह इस तरह दिखता है:

यहां छवि विवरण दर्ज करें


इस दृष्टिकोण का लाभ: यह .NET के लिए समर्थित छवि प्रकारों के भविष्य के परिवर्धन के साथ बना रहेगा। धन्यवाद
UuDdLrLrSs

मुझे यह बहुत पसंद है कि मैंने इसे दुनिया के सबसे घृणित वन-लाइनर में बदल दिया है! 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}")}आह येस। VB, मैं आपको कभी
वेस्टनसुपर्मरे

46

C # में पूरा समाधान यहाँ है:

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

छवियों फ़ाइलों को फ़िल्टर करने के लिए, इस कोड नमूने का उपयोग करें।

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

मुझे टॉम फॉस्ट का जवाब सबसे अच्छा लगता है। यहां उनके समाधान का C # संस्करण है, लेकिन चीजों को थोड़ा सरल करना।

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

11

छवियों के लिए, आप GDI (System.Drawing) से उपलब्ध कोडेक्स प्राप्त कर सकते हैं और थोड़े से काम से अपनी सूची बना सकते हैं। यह जाने का सबसे लचीला तरीका होगा।

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

5
इस टिप के लिए धन्यवाद! मैंने इन्हें जोड़ा और इसने एक आकर्षण की तरह काम किया: var imageExtensions = string.Join(";", ImageCodecInfo.GetImageDecoders().Select(ici => ici.FilenameExtension)); dialog.Filter = string.Format("Images|{0}|All Files|*.*", imageExtensions);
atlantis

उह ... एक टिप्पणी में मल्टी-लाइन कोड ब्लॉक कैसे करें यह निश्चित नहीं है: |
एटलांटिस

1
मूल लेखक नहीं है :)
atlantis

9

String.Join और 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

जो लोग यहाँ वाक्यविन्यास को याद नहीं करना चाहते हैं उनके लिए एक सरल संक्षिप्त वर्णन है:

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

उपयोग:

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

फ़ाइल की विभिन्न श्रेणियों की सूची से मिलान करने के लिए, आप इस तरह से फ़िल्टर का उपयोग कर सकते हैं:

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

1

यह चरम है, लेकिन मैंने FILE_TYPES नामक 2 कॉलम डेटाबेस तालिका का उपयोग करके एक गतिशील, डेटाबेस-चालित फ़िल्टर बनाया है, जिसमें क्षेत्र का नाम EXTENSION और DOCTYPE है:

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

जाहिर है मेरे पास कई अलग-अलग प्रकार और एक्सटेंशन थे, लेकिन मैं इस उदाहरण के लिए इसे सरल कर रहा हूं। यहाँ मेरा कार्य है:

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

एक फिल्टर निकलना चाहिए जो इस तरह दिखता है:

यहां छवि विवरण दर्ज करें


डाउनवॉटर, समझाने की परवाह? आपके पास एक बेहतर विचार है? मेरा काम करता है, जैसा कि मैंने ग्राफिक के माध्यम से प्रदर्शित किया है।
वाप्गुगी

2
Filter="Document files (*.doc,*.docx,*.pdf)|*.doc;*.docx,*.pdf|Image files (*.bmp,*.jpg)|*.bmp;*.jpg";और इससे एक फिल्टर निकलता है जो ऊपर दिए गए उत्तर में अंतिम तस्वीर की तरह दिखता है।
एमजेबी

@mjb यदि आपने मेरे उत्तर को देखा, तो आप देखेंगे कि मेरे पास पहले से ही कोड के शीर्ष पर टिप्पणी है। यदि यह काम नहीं करता, तो मेरे पास यह साबित करने के लिए ग्राफिक नहीं होगा कि यह करता है। जैसा कि मैंने समझाया, कोड डेटाबेस तालिका से मान लेता है और उन्हें संक्षिप्त करता है। आप बस Doctype ("दस्तावेज़", "छवियाँ", आदि) और "FILE_TYPES" नामक तालिका पर 2 कॉलम के रूप में एक्सटेंशन डालेंगे। मान लें कि आपके पास एक फ़ंक्शन DataLayer.Get_DataTable()है जो इस कोड में मौजूद SQL कमांडों को ले जाएगा और आपको एक DataTable वापस भेज देगा, तो यह आपके लिए सब कुछ करेगा। जैसा कि मैंने कहा, हां, चरम था, लेकिन यह काम करता है।
वाप्गुगी

हाँ। लेकिन उन्हें ... आपके पोस्ट का केवल 10% ही सवाल का सीधा जवाब है। अन्य 90% अतिरिक्त जानकारी है जो प्रश्न को हल करने के लिए आवश्यक नहीं है। सवाल डेटाबेस से डेटा प्राप्त करने के बारे में जानकारी का अनुरोध नहीं करता है और कॉन्टेक्टनेट्स के बारे में नहीं पूछा ... और bla ... bla ... bla .... कुछ और SQL कमांड? ... विवरण सारणी? आप वेब सेवाओं से डेटा खींचना भी क्यों शामिल नहीं करते ... और JSON स्ट्रिंग पार्सिंग प्रदर्शित करता है .. या फ़ाइल प्रकार प्राप्त करने के लिए XML डेटा रूपांतरण? और NoSQL से भी? और जावास्क्रिप्ट प्रकार फ़ाइल प्रकार के लिए सामने के अंत से पीछे के अंत तक बुला रहा है? .... नहीं ... जो विषय से बाहर है।
mjb

@ एमजेबी प्वाइंट लिया गया, लेकिन foreachबीच में उस लूप की शक्ति को प्रदर्शित करना भी है । आपके पास विभिन्न सिद्धांतों के टोंस और उनके भीतर विस्तार हो सकते हैं। इसने उन्हें व्यवस्थित करने के तरीके के रूप में कार्य किया, फिर उन्हें प्राप्त करने के लिए कोड लागू किया। मेरे लिए, यह केवल यह मानने से बेहतर था कि प्रत्येक में से केवल 3 ही थे और संघनन स्ट्रिंग दे रहे थे। एक आदमी को मछली सिखाना ....
vapcguy
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.