일반적인 이미지 형식을 허용하도록 필터를 OpenFileDialog로 설정 하시겠습니까?


229

이 코드가 있는데 모든 일반적인 이미지 형식을 허용하도록하려면 어떻게해야합니까? 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로 변경,하지만 다른 종류의?

답변:


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

이 방법으로 모든 파일 형식을 그룹화 할 수도 있습니다. 좋은!
Alper

74

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

그리고 다음과 같이 보입니다 :

여기에 이미지 설명을 입력하십시오


이 방법의 이점 : 지원되는 이미지 유형을 .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}")}아 예. VB, 가끔
보고 싶어요

46

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

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

Tom Faust의 답변이 가장 좋습니다. 다음은 그의 솔루션의 C # 버전이지만 약간 단순화합니다.

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

11

이미지의 경우 GDI (System.Drawing)에서 사용 가능한 코덱을 가져 와서 약간의 작업으로 목록을 작성할 수 있습니다. 가장 유연한 방법입니다.

ImageCodecInfo[] codecs = ImageCodecInfo.GetImageEncoders();

5
이 팁에 감사드립니다! 나는 이것들을 추가했고 그것은 매력처럼 일했다 : var imageExtensions = string.Join(";", ImageCodecInfo.GetImageDecoders().Select(ici => ici.FilenameExtension)); dialog.Filter = string.Format("Images|{0}|All Files|*.*", imageExtensions);
atlantis

어 ... 어떻게 주석에 여러 줄로 된 코드 블록을 만드는지 잘 모르겠습니다.
atlantis

1
원래 작가가 아님 :)
atlantis

9

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

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

이것은 극단적이지만 필드 이름이 EXTENSION 및 DOCTYPE 인 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];
            ...

다음과 같은 필터를 생성해야합니다.

여기에 이미지 설명을 입력하십시오


Downvoter, 설명해야합니까? 더 좋은 아이디어가 있습니까? 그래픽을 통해 시연 한 것처럼 광산이 작동합니다.
vapcguy

2
Filter="Document files (*.doc,*.docx,*.pdf)|*.doc;*.docx,*.pdf|Image files (*.bmp,*.jpg)|*.bmp;*.jpg";그러면 위의 답변에서 마지막 그림처럼 보이는 필터가 생성됩니다.
mjb

@mjb 내 대답을 보면 코드 상단의 주석에 이미 답변이 있음을 알 수 있습니다. 그것이 작동하지 않는다면, 그것을 증명하는 그래픽이 없을 것입니다. 앞에서 설명한 것처럼 코드는 데이터베이스 테이블에서 값을 가져와 연결합니다. "FILE_TYPES"라는 테이블에 Doctype ( "Documents", "Images"등)과 Extension을 2 열로 입력하면됩니다. DataLayer.Get_DataTable()이 코드에있는 SQL 명령을 가져 와서 DataTable을 다시 보내라 는 함수가 있다고 가정하면 모든 것이 가능합니다. 내가 말했듯이, 예, 극단적 이었지만 작동합니다.
vapcguy

예. 하지만 em ... 게시물의 10 %만이 질문에 대한 직접적인 답변입니다. 다른 90 %는 질문을 해결하는 데 필요하지 않은 추가 정보입니다. 이 질문은 데이터베이스에서 데이터를 가져 오는 것에 대한 정보를 요청하지 않으며 연결 ... 및 bla ... bla ... bla .... 더 많은 SQL 명령에 대해 묻지 않았습니다. ... DataTable? 웹 서비스에서 데이터 가져 오기를 포함하고 파일 형식을 얻기 위해 JSON 문자열 구문 분석 또는 XML 데이터 변환을 시연 해 보시지 않겠습니까? 그리고 NoSQL에서? 파일 형식에 대해 프론트 엔드에서 백 엔드로 Javascript를 호출합니까?
mjb

@mjb 포인트를 취했지만 foreach중간 에 그 루프 의 힘을 보여주기 위해서 입니다. 다른 doctype의 TONS와 그 안에 확장이있을 수 있습니다. 이것은 그들을 구성하고 코드를 적용하여 얻을 수있는 방법으로 사용되었습니다. 나를 위해, 단지 3 개만 있다고 가정하고 연결 문자열을주는 것보다 낫습니다. 물고기에 사람이 .... 가르쳐
vapcguy
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.