首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从System.Drawing.Imaging.ImageFormat获取扩展(C#)

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

Stack Overflow用户
提问于 2013-01-04 22:38:30
回答 5查看 15.5K关注 0票数 17

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

示例:

代码语言:javascript
复制
System.Drawing.Imaging.ImageFormat.Tiff -> .tif
System.Drawing.Imaging.ImageFormat.Jpeg -> .jpg
...

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-01-04 22:51:39

也许这就是你要找的东西?

代码语言:javascript
复制
    public static string GetFilenameExtension(ImageFormat format)
    {
        return ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == format.Guid).FilenameExtension;
    }
票数 21
EN

Stack Overflow用户

发布于 2013-08-01 03:30:43

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

代码语言:javascript
复制
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();
    }
}

作为扩展方法,它们可以像这样调用:

代码语言:javascript
复制
ImageFormat format = ImageFormat.Jpeg;
var filePath = "image" + format.FileExtensionFromEncoder();

生成的字符串将为:

代码语言:javascript
复制
"image.jpg"

为了比较这些新方法,我做了一个简短的控制台应用程序:

代码语言:javascript
复制
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();
    }
}

运行此命令将产生以下输出:

代码语言:javascript
复制
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、“.ememybmp”等。

因此,由于原始问题需要“.tif”而不是“.tiff”,因此第一种方法似乎适合您。或者也许这两者的某种组合会是理想的:

代码语言:javascript
复制
    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();
        }
    }
票数 31
EN

Stack Overflow用户

发布于 2016-04-13 17:38:47

Kevin Bray的答案很好,我对以这种方式捕获异常并不是100%满意,所以我稍微调整了一下他的解决方案……

代码语言:javascript
复制
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());
}
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14159148

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档