получить расширение от системы.Рисунок.Изображений.ImageFormat (C#)
можно ли получить расширение для любого заданного System.Drawing.Imaging.ImageFormat
? (C#)
пример:
System.Drawing.Imaging.ImageFormat.Tiff -> .tif
System.Drawing.Imaging.ImageFormat.Jpeg -> .jpg
...
Это можно легко сделать как таблицу поиска, но хотелось бы знать, есть ли что-нибудь изначально .Сеть.
5 ответов
mayby это то, что вы ищете?
public static string GetFilenameExtension(ImageFormat format)
{
return ImageCodecInfo.GetImageEncoders().FirstOrDefault(x => x.FormatID == format.Guid).FilenameExtension;
}
теперь я нашел 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'
вы можете увидеть, что исходный метод терпит неудачу и производит a '.IDFK ' на более неясных форматах, в то время как другие методы фактически просто используют имя формата; ImageFormat.Jpeg,'.jpeg'; ImageFormat.MemoryBmp,'.memorybmp'; и т. д..
так как исходный вопрос хочет.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();
}
}
Я сделал некоторые улучшения на Никлас ответ, потому что я искал способ получить расширение файла, подходящий для добавления к имени файла. Я размещаю свое решение здесь на случай, если другие гуглеры ищут то же самое:
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"
Кевин Брэйответ отличный. Я не был на 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";
}