gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:30:23 24 4
gpt4 key购买 nike

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

例子:

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

这可以作为查找表轻松完成,但想知道 .Net 中是否有任何内容。

最佳答案

我现在找到了 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';等..

因此,由于最初的问题需要“.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();
}
}

关于c# - 从 System.Drawing.Imaging.ImageFormat (C#) 获取扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14159148/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com