Хороший способ проверить, имеет ли расширение файла изображение или нет.
У меня есть эти типы файлов. Фильтры:
public const string Png = "PNG Portable Network Graphics (*.png)|" + "*.png";
public const string Jpg = "JPEG File Interchange Format (*.jpg *.jpeg *jfif)|" + "*.jpg;*.jpeg;*.jfif";
public const string Bmp = "BMP Windows Bitmap (*.bmp)|" + "*.bmp";
public const string Tif = "TIF Tagged Imaged File Format (*.tif *.tiff)|" + "*.tif;*.tiff";
public const string Gif = "GIF Graphics Interchange Format (*.gif)|" + "*.gif";
public const string AllImages = "Image file|" + "*.png; *.jpg; *.jpeg; *.jfif; *.bmp;*.tif; *.tiff; *.gif";
public const string AllFiles = "All files (*.*)" + "|*.*";
static FilesFilters()
{
imagesTypes = new List<string>();
imagesTypes.Add(Png);
imagesTypes.Add(Jpg);
imagesTypes.Add(Bmp);
imagesTypes.Add(Tif);
imagesTypes.Add(Gif);
}
OBS: Существуют ли какие-либо фильтры по умолчанию в .NET или бесплатная библиотека для этого?
Мне нужен статический метод, который проверяет, является ли строка изображением или нет. Как бы вы решили это?
//ext == Path.GetExtension(yourpath)
public static bool IsImageExtension(string ext)
{
return (ext == ".bmp" || .... etc etc...)
}
Решение с использованием Jeroen Vannevel EndsWith. Я думаю, что все в порядке.
public static bool IsImageExtension(string ext)
{
return imagesTypes.Contains(ext);
}
Ответы
Ответ 1
Вы можете использовать .endsWith(ext)
. Это не очень безопасный метод: я мог бы переименовать 'bla.jpg' в 'bla.png', и он все равно будет файлом jpg.
public static bool HasImageExtension(this string source){
return (source.EndsWith(".png") || source.EndsWith(".jpg"));
}
Это обеспечивает более безопасное решение:
string InputSource = "mypic.png";
System.Drawing.Image imgInput = System.Drawing.Image.FromFile(InputSource);
Graphics gInput = Graphics.fromimage(imgInput);
Imaging.ImageFormat thisFormat = imgInput.rawformat;
Ответ 2
private static readonly string[] _validExtensions = {"jpg","bmp","gif","png"}; // etc
public static bool IsImageExtension(string ext)
{
return _validExtensions.Contains(ext.ToLower());
}
Если вы хотите, чтобы список можно было настраивать во время выполнения без перекомпиляции, добавьте что-то вроде:
private static string[] _validExtensions;
private static string[] ValidExtensions()
{
if(_validExtensions==null)
{
// load from app.config, text file, DB, wherever
}
return _validExtensions
}
public static bool IsImageExtension(string ext)
{
return ValidExtensions().Contains(ext.ToLower());
}
Ответ 3
Этот метод автоматически создает фильтр для OpenFileDialog
. Он использует информацию об декодерах изображений, поддерживаемых Windows. Он также добавляет информацию о "неизвестных" форматах изображений (см. default
случай оператора switch
).
private static string SupportedImageDecodersFilter()
{
ImageCodecInfo[] encoders = ImageCodecInfo.GetImageEncoders();
string allExtensions = encoders
.Select(enc => enc.FilenameExtension)
.Aggregate((current, next) => current + ";" + next)
.ToLowerInvariant();
var sb = new StringBuilder(500)
.AppendFormat("Image files ({0})|{1}", allExtensions.Replace(";", ", "),
allExtensions);
foreach (ImageCodecInfo encoder in encoders) {
string ext = encoder.FilenameExtension.ToLowerInvariant();
// ext = "*.bmp;*.dib;*.rle" descr = BMP
// ext = "*.jpg;*.jpeg;*.jpe;*.jfif" descr = JPEG
// ext = "*.gif" descr = GIF
// ext = "*.tif;*.tiff" descr = TIFF
// ext = "*.png" descr = PNG
string caption;
switch (encoder.FormatDescription) {
case "BMP":
caption = "Windows Bitmap";
break;
case "JPEG":
caption = "JPEG file";
break;
case "GIF":
caption = "Graphics Interchange Format";
break;
case "TIFF":
caption = "Tagged Image File Format";
break;
case "PNG":
caption = "Portable Network Graphics";
break;
default:
caption = encoder.FormatDescription;
break;
}
sb.AppendFormat("|{0} ({1})|{2}", caption, ext.Replace(";", ", "), ext);
}
return sb.ToString();
}
Используйте его следующим образом:
var dlg = new OpenFileDialog {
Filter = SupportedImageDecodersFilter(),
Multiselect = false,
Title = "Choose Image"
};
Приведенный выше код (слегка измененный) можно использовать для поиска доступных расширений файлов изображений. Чтобы проверить, указывает ли данное расширение файла изображение, я бы добавил допустимое расширение в HashSet
. У HashSets есть
O (1) время доступа! Обязательно выберите нечувствительный к регистру строковый сравнитель. Так как расширения файлов не содержат акцентированных или не латинских букв, культуру можно безопасно игнорировать. Поэтому я использую сравнение порядковых строк.
var imageExtensions = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
imageExtensions.Add(".png");
imageExtensions.Add(".bmp");
...
И проверьте, является ли имя файла изображением:
string extension = Path.GetExtension(filename);
bool isImage = imageExtensions.Contains(extension);
Ответ 4
Опция должна состоять в том, чтобы иметь список всех возможных допустимых расширений изображений, тогда этот метод будет проверять только, входит ли входящее расширение в эту коллекцию:
private static readonly HashSet<string> validExtensions = new HashSet<string>()
{
"png",
"jpg",
"bmp"
// Other possible extensions
};
Затем в проверке вы просто проверяете это:
public static bool IsImageExtension(string ext)
{
return validExtensions.Contains(ext);
}
Ответ 5
Я просто должен был сделать что-то похожее. Вот мое решение:
private bool IsImage(string fileExtension)
{
return GetImageFileExtensions().Contains(fileExtension.ToLower()));
}
private static List<string> GetImageFileExtensions()
{
return ImageCodecInfo.GetImageEncoders()
.Select(c => c.FilenameExtension)
.SelectMany(e => e.Split(';'))
.Select(e => e.Replace("*", "").ToLower())
.ToList();
}