Как я могу определить, является ли файл файлом изображения в .NET?
Я не хочу полагаться на расширение файла. Мне все равно, какой тип изображения (.jpg, .png и т. Д.), Я просто хочу знать, является ли файл изображением или нет. Я бы предпочел не использовать никакие не .NET библиотеки, если это возможно.
Лучший способ, которым я знаю, как это сделать, заключается в следующем:
bool isImageFile;
try
{
Image.FromFile(imageFile).Dispose();
isImageFile = true;
}
catch (OutOfMemoryException)
{
isImageFile = false;
}
Как отмечено здесь:http://msdn.microsoft.com/en-us/library/stf701f5.aspx, Image.FromFile()
бросаетOutOfMemoryException
если файл не является допустимым форматом изображения. Использование выше дает мнеименно тот результат, который я хочуОднако я бы предпочел не использовать его по следующим причинам:
Image.FromFile()
загружает весь файл изображения (если это файл изображения) в память. Я полагаю, что это расточительно, потому что мне нужен только тип файла, и на этом этапе в моем коде не требуется никаких дополнительных манипуляций с изображениями.Я не люблю ловитьOutOfMemoryException
s потому что что, если есть РЕАЛЬНАЯ проблема нехватки памяти, и моя программа глотает это и продолжает идти?Есть ли лучшие способы сделать это? Или же,какие-либо / все мои проблемы, перечисленные выше, неоправданны?
Редактировать: С момента получения ответов здесь, этотри решения Теперь я знаю о:
Загрузить все изображение в память черезImage.FromFile()
и попытка поймать.Pros: Глубже проверяет содержимое файлов изображений; охватывает много типов изображений.Cons: Самый медленный; накладные расходы от try-catch и загрузки полного файла изображения в память; потенциальная опасность от «реального» исключения OutOfMemoryException.Проверьте байты заголовка файла изображения.Pros: Быстрое, низкое использование памяти.Consпотенциально хрупкие; нужно программировать для каждого типа файла.Проверьте расширение файла.Pros: Самый быстрый; Простейшие.Cons: Не работает во всех ситуациях; легче всего ошибиться.(Я не вижу явного «победителя», поскольку могу представить себе ситуацию, в которой каждый из них был бы уместен. Для целей моего приложения проверка типа файла происходит достаточно редко, чтобы проблемы с производительностью метода 1 не были проблемой.)