Установка фильтра в 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. :)
}
}
обратите внимание, что фильтр установлен .txt-файл. Я может изменить на PNG, но что из других типов?
11 ответов:
С документы, синтаксис фильтра, который вам нужен, выглядит следующим образом:
Office Files|*.doc;*.xls;*.pptт. е. разделите несколько расширений точкой с запятой -- таким образом,
Image Files|*.jpg;*.jpeg;*.png;....
следуйте этой схеме, если вы просматриваете файлы изображений:
dialog.Filter = "Image files (*.jpg, *.jpeg, *.jpe, *.jfif, *.png) | *.jpg; *.jpeg; *.jpe; *.jfif; *.png";
вот пример предложения ImageCodecInfo (в 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# здесь:
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.Рисунок) и построить свой список из этого с небольшой работой. Это был бы самый гибкий путь.
ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();
мне больше всего нравится ответ Тома Фауста. Вот версия его решения на C#, но немного упрощающая вещи.
var codecs = ImageCodecInfo.GetImageEncoders(); var codecFilter = "Image Files|"; foreach (var codec in codecs) { codecFilter += codec.FilenameExtension + ";"; } dialog.Filter = codecFilter;
просто некрокоммент для использования строки.Присоединяйтесь и 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())); } }использование:
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();
чтобы соответствовать списку различных категорий файлов, вы можете использовать фильтр следующим образом:
var dlg = new Microsoft.Win32.OpenFileDialog() { DefaultExt = ".xlsx", Filter = "Excel Files (*.xls, *.xlsx)|*.xls;*.xlsx|CSV Files (*.csv)|*.csv" };
это экстремально, но я построил динамический, управляемый базой данных фильтр с использованием таблицы базы данных 2 столбца с именем FILE_TYPES, с расширением имен полей и 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]; ...должен дать фильтр, который выглядит так:


Comments