从System.Drawing.Imaging.ImageFormat(C#)获取扩展名

从System.Drawing.Imaging.ImageFormat(C#)获取扩展名,c#,.net,system.drawing.imaging,C#,.net,System.drawing.imaging,对于任何给定的System.Drawing.Imaging.ImageFormat,是否可以获得扩展名?(C#) 例如: System.Drawing.Imaging.ImageFormat.Tiff -> .tif System.Drawing.Imaging.ImageFormat.Jpeg -> .jpg ... 这可以很容易地作为一个查找表来完成,但是想知道.Net中是否有本机的内容。也许这就是您要查找的内容 public static string GetFile

对于任何给定的
System.Drawing.Imaging.ImageFormat
,是否可以获得扩展名?(C#)

例如:

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

这可以很容易地作为一个查找表来完成,但是想知道.Net中是否有本机的内容。

也许这就是您要查找的内容

    public static string GetFilenameExtension(ImageFormat format)
    {
        return ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == format.Guid).FilenameExtension;
    }

我对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"
"image.jpg"

我现在找到了三种方法,其中最后两种是等效的。所有这些都是扩展方法,并打算以“.foo”的形式生成扩展

作为扩展方法,可以调用它们,如下所示:

ImageFormat format = ImageFormat.Jpeg;
var filePath = "image" + format.FileExtensionFromEncoder();
结果字符串将是:

"image.JPG"
"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';等等

因此,正如最初的问题想要的是“.tif”而不是“.tiff”,第一种方法似乎适合您。或者,这两种方法的某种组合是理想的:

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

凯文·布雷的回答很好。不过,我并不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());
}

在我的生产代码中,我使用以下内容:

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

可能重复的(当然您应该在调用其属性之前测试FirstOrDefault是否确实找到了某些内容;)Quote:
对于
System.Drawing.Imaging.ImageFormat.Png
它返回
*.Png
,而不是
.Png
,按照op的要求。这是一个地狱般的答案…干得好!在土耳其,您必须这样指定区域性:ToLower(newcultureinfo(“en-us”)),因为小写GIF在土耳其语中是gıf(带一个ı)。