17

任意の拡張子を取得することは可能System.Drawing.Imaging.ImageFormatですか? (C#)

例:

System.Drawing.Imaging.ImageFormat.Tiff -> .tif
System.Drawing.Imaging.ImageFormat.Jpeg -> .jpg
...

これはルックアップ テーブルとして簡単に実行できますが、.Net にネイティブに何かがあるかどうかを知りたいと思っていました。

4

5 に答える 5

31

これを行う 3 つの方法を見つけましたが、そのうちの最後の 2 つは同等です。すべて拡張メソッドであり、「.foo」形式の拡張を生成することを意図しています。

static class ImageFormatUtils
{
    //Attempt 1: Use ImageCodecInfo.GetImageEncoders
    public static string FileExtensionFromEncoder(this ImageFormat format)
    {
        try
        {
            return ImageCodecInfo.GetImageEncoders()
                    .First(x => x.FormatID == format.Guid)
                    .FilenameExtension
                    .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
                    .First()
                    .Trim('*')
                    .ToLower();
        }
        catch (Exception)
        {
            return ".IDFK";
        }
    }

    //Attempt 2: Using ImageFormatConverter().ConvertToString()
    public static string FileExtensionFromConverter(this ImageFormat format)
    {
        return "." + new ImageFormatConverter().ConvertToString(format).ToLower();
    }

    //Attempt 3: Using ImageFormat.ToString()
    public static string FileExtensionFromToString(this ImageFormat format)
    {
        return "." + format.ToString().ToLower();
    }
}

拡張メソッドであるため、次のように呼び出すことができます。

ImageFormat format = ImageFormat.Jpeg;
var filePath = "image" + format.FileExtensionFromEncoder();

結果の文字列は次のようになります。

"image.jpg"

これらの新しい方法を比較するために、短いコンソール アプリを作成しました。

class Program
{
    static void Main()
    {
        var formats = new[]
        {
            ImageFormat.Bmp, ImageFormat.Emf, ImageFormat.Exif, ImageFormat.Gif,
            ImageFormat.Icon, ImageFormat.Jpeg, ImageFormat.MemoryBmp, ImageFormat.Png,
            ImageFormat.Tiff, ImageFormat.Wmf
        };

        foreach (var format in formats)
        {
            Console.WriteLine("FromEncoder: '{0}', FromConverter: '{1}', FromToString: '{2}'", format.FileExtensionFromEncoder(), format.FileExtensionFromConverter(), format.FileExtensionFromToString());
        }
        Console.Read();
    }
}

これを実行すると、次の出力が得られます。

FromEncoder: '.bmp', FromConverter: '.bmp', FromToString: '.bmp'
FromEncoder: '.IDFK', FromConverter: '.emf', FromToString: '.emf'
FromEncoder: '.IDFK', FromConverter: '.exif', FromToString: '.exif'
FromEncoder: '.gif', FromConverter: '.gif', FromToString: '.gif'
FromEncoder: '.IDFK', FromConverter: '.icon', FromToString: '.icon'
FromEncoder: '.jpg', FromConverter: '.jpeg', FromToString: '.jpeg'
FromEncoder: '.IDFK', FromConverter: '.memorybmp', FromToString: '.memorybmp'
FromEncoder: '.png', FromConverter: '.png', FromToString: '.png'
FromEncoder: '.tif', FromConverter: '.tiff', FromToString: '.tiff'
FromEncoder: '.IDFK', FromConverter: '.wmf', FromToString: '.wmf'

元の方法が失敗し、よりあいまいな形式で「.IDFK」を生成することがわかりますが、他の方法は実際には形式の名前を使用しているだけです。ImageFormat.JPEG, '.jpeg'; ImageFormat.MemoryBmp, '.memorybmp'; 等..

したがって、元の質問では「.tiff」ではなく「.tif」が必要であるため、最初の方法が適しているようです。または、2 つの組み合わせが理想的かもしれません。

    public static string FileExtensionFromEncoder(this ImageFormat format)
    {
        try
        {
            return ImageCodecInfo.GetImageEncoders()
                    .First(x => x.FormatID == format.Guid)
                    .FilenameExtension
                    .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
                    .First()
                    .Trim('*')
                    .ToLower();
        }
        catch (Exception)
        {
            return "." + format.ToString().ToLower();
        }
    }
于 2013-07-31T19:30:42.683 に答える
21

多分これはあなたが探しているものですか?

    public static string GetFilenameExtension(ImageFormat format)
    {
        return ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == format.Guid).FilenameExtension;
    }
于 2013-01-04T14:51:39.287 に答える
6

ケビン・ブレイの答えは素晴らしいです。ただし、この方法で例外をキャッチすることに100%満足していたわけではないので、彼のソリューションをわずかに調整しました...

public static string GetFileExtension(this ImageFormat imageFormat)
{
    var extension = ImageCodecInfo.GetImageEncoders()
        .Where(ie => ie.FormatID == imageFormat.Guid)
        .Select(ie => ie.FilenameExtension
            .Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
            .First()
            .Trim('*')
            .ToLower())
        .FirstOrDefault();

    return extension ?? string.Format(".{0}", imageFormat.ToString().ToLower());
}
于 2016-04-13T09:38:47.057 に答える
3

ファイル名に追加するのに適したファイル拡張子を取得する方法を探していたので、 Niklasの回答を改良しました。他のグーグル社員が同じものを探している場合に備えて、ここに私のソリューションを投稿しています:

public string GetFilenameExtension(ImageFormat format)
{
    return ImageCodecInfo.GetImageEncoders()
                         .First(x => x.FormatID == format.Guid)
                         .FilenameExtension
                         .Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries)
                         .First()
                         .Trim('*');
}

したがって、次のように呼び出す場合:

var filePath = "image" + GetFilenameExtension(ImageFormat.Jpeg);

結果の文字列は次のようになります。

"image.JPG"
于 2013-03-03T02:00:57.043 に答える
3

私のプロダクションコードでは、これを使用しています:

    public static string GetExtensionFromImageFormat(ImageFormat img)
    {
        if (img.Equals(ImageFormat.Jpeg)) return ".jpg";
        else if (img.Equals(ImageFormat.Png)) return ".png";
        else if (img.Equals(ImageFormat.Gif)) return ".gif";
        else if (img.Equals(ImageFormat.Bmp)) return ".bmp";
        else if (img.Equals(ImageFormat.Tiff)) return ".tif";
        else if (img.Equals(ImageFormat.Icon)) return ".ico";
        else if (img.Equals(ImageFormat.Emf)) return ".emf";
        else if (img.Equals(ImageFormat.Wmf)) return ".wmf";
        else if (img.Equals(ImageFormat.Exif)) return ".exif";
        else if (img.Equals(ImageFormat.MemoryBmp)) return ".bmp";
        return ".unknown";
    }
于 2016-05-31T13:05:47.897 に答える