টিপিক্যাল ইমেজ ফর্ম্যাটগুলিকে অনুমতি দেওয়ার জন্য একটি ওপেনফায়ালডায়লেগ ফিল্টার সেট করছেন?


229

আমার এই কোডটি আছে, আমি কীভাবে এটিকে সমস্ত সাধারণ চিত্রের ফর্ম্যাটগুলি গ্রহণ করার অনুমতি দেব? পিএনজি, জেপিইজি, জেপিজি, জিআইএফ?

আমার এখন পর্যন্ত যা আছে তা এখানে:

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
সম্ভবত পাইপের চরিত্রের আগে এবং পরে এবং ফিল্টার অংশে আধা-কোলন এবং নক্ষত্রের মধ্যবর্তী স্থানগুলি থেকে মুক্তি পেতে চান। তবে ভাল, অন্যথায়।
vapcguy

আপনি এইভাবে কোনও ফাইল টাইপকেও গ্রুপ করতে পারেন। নিস!
আল্পার

74

এখানে চিত্রকোডেক ইনফো পরামর্শের একটি উদাহরণ (ভিবিতে):

   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}")}অই হ্যাঁ. ভিবি, আমি আপনাকে মাঝে মাঝে মিস করি
ওয়েস্টোনসপারমার

46

সি # তে সম্পূর্ণ সমাধান এখানে রয়েছে:

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

আমি টম ফাউস্টের উত্তরটি সবচেয়ে পছন্দ করি। এখানে তার সমাধানের একটি সি # সংস্করণ দেওয়া হয়েছে, তবে জিনিসগুলি কিছুটা সহজ করে তোলা।

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

11

চিত্রগুলির জন্য, আপনি জিডিআই (সিস্টেম.ড্রেইং) থেকে উপলব্ধ কোডেকগুলি পেতে এবং সেখান থেকে আপনার কাজটি সামান্য কাজ করে তৈরি করতে পারেন। এটি হবে সবচেয়ে নমনীয় উপায়।

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

5
এই টিপ জন্য ধন্যবাদ! আমি এগুলি যুক্ত করেছি এবং এটি একটি var imageExtensions = string.Join(";", ImageCodecInfo.GetImageDecoders().Select(ici => ici.FilenameExtension)); dialog.Filter = string.Format("Images|{0}|All Files|*.*", imageExtensions);
কবজির

উঘ ... একটি মন্তব্যে মাল্টি-লাইন কোড ব্লকগুলি কীভাবে করবেন তা নিশ্চিত নন: |
আটলান্টিস

1
আসল লেখক নয় :)
আটলান্টিস

9

স্ট্রিং.জইন এবং লিনকিউ ব্যবহারের জন্য কেবল একটি নেক্রোকম্যাটমেন্ট।

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

এর মতো দেখতে এমন ফিল্টার পাওয়া উচিত:

এখানে চিত্র বর্ণনা লিখুন


ডাউনভোটার, বোঝানোর যত্ন আছে? আপনি একটি ভাল ধারণা আছে? খনি কাজ করে, যেমন আমি একটি গ্রাফিকের মাধ্যমে প্রদর্শন করেছি।
vapcguy

2
Filter="Document files (*.doc,*.docx,*.pdf)|*.doc;*.docx,*.pdf|Image files (*.bmp,*.jpg)|*.bmp;*.jpg";এবং এটিতে এমন ফিল্টার পাওয়া উচিত যা উপরের উত্তরের শেষ চিত্রের মতো দেখাচ্ছে।
এমজেবি

@ এমজেবি যদি আপনি আমার উত্তরটি দেখে থাকেন তবে আপনি দেখতে পাবেন যে কোডের শীর্ষে থাকা মন্তব্যে আমার এটি ইতিমধ্যে ছিল। যদি এটি কাজ না করে তবে আমার গ্রাফিকটি প্রমাণ করে না যে এটি করে। আমি যেমন বর্ণনা করেছি, কোডটি একটি ডাটাবেস টেবিল থেকে মান গ্রহণ করে এবং তাদের সাথে সম্মতি জানায়। আপনি কেবল "FILE_TYPES" নামক টেবিলে ডক্টাইপ ("ডকুমেন্টস", "চিত্রগুলি" ইত্যাদি) এবং এক্সটেনশনটিকে 2 টি কলাম হিসাবে রেখেছিলেন। ধরে DataLayer.Get_DataTable()নিলাম আপনার কাছে একটি ফাংশন রয়েছে যা এই কোডটিতে আমার থাকা এসকিউএল কমান্ডগুলি গ্রহণ করবে এবং আপনাকে একটি ডেটা টেবিল ফিরিয়ে দিবে, এটি আপনার জন্য সবকিছু করবে। আমি যেমন বলেছিলাম, হ্যাঁ, চরম ছিল, কিন্তু এটি কাজ করে।
vapcguy

হ্যাঁ. তবে Em ... আপনার পোস্টের 10 %ই প্রশ্নের সরাসরি উত্তর। অন্যান্য 90% অতিরিক্ত তথ্য যা প্রশ্নের সমাধানের জন্য প্রয়োজনীয় নয়। প্রশ্নটি ডাটাবেস থেকে ডেটা প্রাপ্ত করার তথ্যের জন্য অনুরোধ করে না এবং কনকনেটেটস ... এবং ব্লে ... ব্লে ... বেল .... আরও কিছু এসকিউএল কমান্ড সম্পর্কে জিজ্ঞাসা করে না? ... ডেটা টেবিল? আপনি কেন ওয়েব পরিষেবাদি থেকে ডেটা টানতে অন্তর্ভুক্ত করবেন না ... এবং ফাইলের ধরনগুলি পেতে JSON স্ট্রিং পার্সিং .. বা এক্সএমএল ডেটা রূপান্তর দেখান? এবং নোএসকিউএল থেকেও? এবং জাভাস্ক্রিপ্ট ফাইল প্রকারের জন্য প্রথম প্রান্ত থেকে পিছনের দিকে কলিং? .... না ... এটি বিষয়টির বাইরে।
এমজেবি

@ এমজেবি পয়েন্টটি নেওয়া হয়েছে, তবে এটি মাঝখানে লুপটির শক্তি প্রদর্শনও করতে পারে foreach। আপনার কাছে বিভিন্ন ডক্টাইপ টোনস এবং সেগুলির মধ্যে এক্সটেনশন থাকতে পারে। এটি তাদের সংগঠিত করার উপায় হিসাবে কাজ করেছে, তারপরে সেগুলি পেতে কোড প্রয়োগ করুন। আমার জন্য, কেবলমাত্র ধরে নেওয়া হয়েছিল যে কেবলমাত্র প্রত্যেকে কেবলমাত্র 3 জন রয়েছে এবং উপসংহারের স্ট্রিংটি দেওয়া ভাল। একজন মানুষকে মাছ
শিখিয়ে দিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.