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

Ser*_*pia 217 c# openfiledialog winforms

我有这个代码,我怎么能让它接受所有典型的图像格式?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. :)
    }             
}
Run Code Online (Sandbox Code Playgroud)

请注意,过滤器设置为.txt文件.我可以改为PNG,但其他类型呢?

ito*_*son 272

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

Office Files|*.doc;*.xls;*.ppt
Run Code Online (Sandbox Code Playgroud)

即用分号分隔多个扩展名 - 因此,Image Files|*.jpg;*.jpeg;*.png;....


Dev*_*hta 167

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

dialog.Filter =  "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";
Run Code Online (Sandbox Code Playgroud)

  • 可能想要去除管道字符前后的空格以及过滤器部分中的分号和星号之间的空格.但好,否则. (5认同)

小智 68

这是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", "*.*")
Run Code Online (Sandbox Code Playgroud)

它看起来像这样:

在此输入图像描述

  • 我非常喜欢这个,所以我把它变成了世界上最恶心的一句台词!`Dim ofd As New OpenFileDialog() With {.Filter = ImageCodecInfo.GetImageEncoders().Aggregate("所有文件 (*.*)|*.*", Function(s, c) $"{s}|{c. CodecName.Substring(8).Replace("Codec", "Files").Trim()} ({c.FilenameExtension})|{c.FilenameExtension}")}` 啊,是的。VB,有时我想你 (2认同)

Dev*_*per 44

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  
    }
} 
Run Code Online (Sandbox Code Playgroud)


小智 21

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

//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
   ....
}
Run Code Online (Sandbox Code Playgroud)


Nie*_*elW 12

我最喜欢Tom Faust的答案.这是他的解决方案的C#版本,但稍微简化了一些事情.

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


Mua*_*Dib 9

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

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的提示!我添加了这些,它就像一个魅力:`var imageExtensions = string.Join(";",ImageCodecInfo.GetImageDecoders().Select(ici => ici.FilenameExtension));``dialog.Filter = string.Format("图像| {0} |所有文件|*.*",imageExtensions);` (4认同)

小智 9

只是使用string.Join和LINQ的一个necrocomment.

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()));
Run Code Online (Sandbox Code Playgroud)


Rob*_*off 6

写出您的应用程序所需的类型。(参考FileDialog.Filter)。以下是所有最常见的图像格式

private static string GetImageFilter()
{
    return
        "All Files (*.*)|*.*" +
        "|All Pictures (*.emf;*.wmf;*.jpg;*.jpeg;*.jfif;*.jpe;*.png;*.bmp;*.dib;*.rle;*.gif;*.emz;*.wmz;*.tif;*.tiff;*.svg;*.ico)" +
            "|*.emf;*.wmf;*.jpg;*.jpeg;*.jfif;*.jpe;*.png;*.bmp;*.dib;*.rle;*.gif;*.emz;*.wmz;*.tif;*.tiff;*.svg;*.ico" +
        "|Windows Enhanced Metafile (*.emf)|*.emf" +
        "|Windows Metafile (*.wmf)|*.wmf" +
        "|JPEG File Interchange Format (*.jpg;*.jpeg;*.jfif;*.jpe)|*.jpg;*.jpeg;*.jfif;*.jpe" +
        "|Portable Network Graphics (*.png)|*.png" +
        "|Bitmap Image File (*.bmp;*.dib;*.rle)|*.bmp;*.dib;*.rle" +
        "|Compressed Windows Enhanced Metafile (*.emz)|*.emz" +
        "|Compressed Windows MetaFile (*.wmz)|*.wmz" +
        "|Tag Image File Format (*.tif;*.tiff)|*.tif;*.tiff" +
        "|Scalable Vector Graphics (*.svg)|*.svg" +
        "|Icon (*.ico)|*.ico";
}
Run Code Online (Sandbox Code Playgroud)

使用示例

设置FilterIndex = 2为预选“所有图片”。除非有充分的理由,否则不要设置。openFileDialog.InitialDirectory

void OpenImageFile()
{
    var openFileDialog  = new OpenFileDialog
    {
        Filter = GetImageFilter(),
        FilterIndex = 2,
        RestoreDirectory = true
    };
    DialogResult result = openFileDialog.ShowDialog();

    // do something with your file
    // bool resultOk = (result == System.Windows.Forms.DialogResult.OK);
    // string filePath = openFileDialog.FileName;
    // ...
}
Run Code Online (Sandbox Code Playgroud)