C# 将过滤器设置为OpenFileDialog以允许典型的图像格式?

C# 将过滤器设置为OpenFileDialog以允许典型的图像格式?,c#,winforms,openfiledialog,C#,Winforms,Openfiledialog,我有这个代码,我如何允许它接受所有典型的图像格式?PNG,JPEG,JPG,GIF 以下是我目前掌握的情况: public void EncryptFile() { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*"; dialog.InitialDirectory = @"C:\";

我有这个代码,我如何允许它接受所有典型的图像格式?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文件。我可以更改为PNG,但其他类型如何?

从中,您需要的过滤器语法如下:

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

i、 e.用分号分隔多个扩展名——因此,
Image Files |*.jpg;*。jpeg;*。巴布亚新几内亚

对于图像,您可以从GDI(System.Drawing)获得可用的编解码器,并通过少量工作从中构建列表。这将是最灵活的方式

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

以下是ImageCodecInfo建议的示例(在VB中):

看起来是这样的:

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

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  
    }
} 
private void b选择图像\u单击(对象发送者,路由目标)
{
//“配置打开的文件”对话框
Microsoft.Win32.OpenFileDialog dlg=新的Microsoft.Win32.OpenFileDialog();
dlg.Filter=“”;
ImageCodecInfo[]codecs=ImageCodecInfo.GetImageEncoders();
string sep=string.Empty;
foreach(编解码器中的var c)
{
字符串codecName=c.codecName.Substring(8).替换(“编解码器”,“文件”).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,“所有文件”,“*”);
dlg.DefaultExt=“.png”//默认文件扩展名
//“显示打开的文件”对话框
可为空的结果=dlg.ShowDialog();
//“处理打开的文件”对话框结果
如果(结果==真)
{
//打开文件
字符串文件名=dlg.fileName;
//对文件名做些什么
}
} 

如果您浏览图像文件,请遵循以下模式:

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

要过滤图像文件,请使用此代码示例

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

只是使用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()));

对于那些不想每次都记住语法的人,这里有一个简单的封装:

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

我最喜欢汤姆·浮士德的回答。这是他的解决方案的C#版本,但简化了一点

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

这是极端的,但我使用名为FILE_TYPES的2列数据库表构建了一个动态的数据库驱动过滤器,该表具有字段扩展名和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];
            ...
应生成如下所示的筛选器:

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

为了匹配不同类别文件的列表,您可以使用如下过滤器:

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

必须包括所有图像类型扩展名,并允许所有文件作为选项


所有文件|.|所有图像|.jpg;。jpeg;。巴布亚新几内亚;。gif;。tif;。bmp | JPEG Images |.jpg | PNG Images |.PNG |.PNG | | | |.PNG | | | | | |.PNG | | | | | | | | | | | | | | | | PNG Images|
ugh…不知道如何在注释中执行多行代码块:|不是原始作者:)可能希望在筛选部分中去掉管道字符前后以及分号和星号之间的空格。但是很好,否则。您也可以用这种方式对任何文件类型进行分组。很好!Downvoter,需要解释吗?您有一个b更好的想法?我的想法很有效,正如我通过一个图形演示的那样。
Filter=“文档文件(*.doc,*.docx,*.pdf)|*.doc;*。docx,*.pdf |图像文件(*.bmp,*.jpg)|*.bmp;*。jpg";
这应该会产生一个过滤器,看起来像上面答案中的最后一张图片。@mjb如果你看了我的答案,你会发现我在代码顶部的注释中已经有了这个过滤器。如果它不起作用,我就不会有图形来证明它起作用。正如我所解释的,代码从数据库表中获取值并连接它们。您只需将Doctype(“Documents”、“Images”等)和扩展名作为两列放在一个名为“FILE_TYPES”的表中。假设您有一个名为
DataLayer.Get_DataTable()
的函数,该函数将接受我在这段代码中的SQL命令并向您返回一个DataTable,它将为您做所有事情。正如我所说,是的,是极端的,但它确实起作用。但是。。。你的帖子中只有10%是这个问题的直接答案。另外90%是解决问题所不需要的额外信息。该问题不要求提供有关从数据库获取数据的信息,也不要求提供有关连接的信息。。。还有布拉。。。呜呜……呜呜。。。。还有一些SQL命令吗。。。数据表?为什么不包括从Web服务中提取数据。。。并演示JSON字符串解析。。或XML数据转换以获取文件类型?还有NoSQL?和Javascript从前端到后端调用文件类型?。。。。不这不是主题。@ MJB点,但它也演示了“代码<前述< /代码>循环中间的力量”。您可能有很多不同的doctype和扩展。这是一种组织它们,然后应用代码获取它们的方法。对我来说,这比仅仅假设每个字符串只有3个并给出连接字符串要好。教一个人钓鱼……这种方法的好处是:它将跟上未来在.NET中添加的任何受支持的图像类型。谢谢,我太喜欢这个了,我把它变成了世界上最恶心的一行
Dim ofd As New OpenFileDialog()和{.Filter=ImageCodecInfo.GetImageEncoders().Aggregate(“所有文件(*.*.*),函数(s,c)$”{s}{c.CodecName.Substring(8)。替换(“编解码器”,“文件”).Trim()}({c.FilenameExtension}){c.FilenameExtension})}
Ah,是的。VB,我有时想你