将筛选器设置为OpenFileDialog以允许使用典型的图像格式?

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

注意filter被设置为.txt文件。 我可以更改为PNG,但其他types?

从文档中 ,您需要的filter语法如下所示:

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

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

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

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

这是一个ImageCodecInfobuild议(在VB中)的例子:

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

它看起来像这样:

在这里输入图像说明

C#完整的解决scheme在这里:

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

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

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

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

 ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders(); 

我最喜欢汤姆·福斯特的答案。 这是他的解决scheme的C#版本,但简化了一些东西。

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

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

对于那些不想记住句法的人来说,这里是一个简单的封装:

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

为了匹配不同类别的文件的列表,你可以使用这样的filter:

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

这是极端的,但我build立了一个dynamic的数据库驱动的filter,使用名为FILE_TYPES的2列数据库表,字段名称为EXTENSION和DOCTYPE:

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

显然,我有许多不同的types和扩展,但是我正在简化它的这个例子。 这是我的function:

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

应该产生一个如下所示的filter:

在这里输入图像说明