Я не хочу полагаться на расширение файла. Я не хочу знать, какой тип изображения (.jpg,.png и т.д.), Я просто хочу знать, является ли файл изображением или нет. Я бы предпочел не использовать любые DLL файлы .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
, потому что, если есть РЕАЛЬНАЯ проблема нехватки памяти, и моя программа проглатывает ее и продолжает идти?
Есть ли какие-нибудь более эффективные способы сделать это? Или, - все/все мои проблемы, перечисленные выше, необоснованны?
Изменить:. Получив ответы здесь, это три решения. Теперь я знаю:
- Загрузите все изображение в память через
Image.FromFile()
и попытку.- Плюсы: более глубокая проверка содержимого содержимого файлов изображений; охватывает многие типы изображений.
- Минусы: Slowest; накладные расходы от попытки захвата и загрузки полного файла изображения в память; потенциальная опасность от ловли "реального" исключения OutOfMemoryException.
- Проверьте байты заголовка файла изображения.
- Плюсы: быстрое использование с низкой памятью.
- Минусы: потенциально хрупкие; необходимо запрограммировать для каждого типа файла.
- Проверьте расширение файла.
- Плюсы: быстрый; Простейшие.
- Минусы: не работает во всех ситуациях; наиболее легко ошибочно.
(Я не вижу ясного "победителя", так как я могу представить ситуацию, в которой каждый из них подходит. Для целей моего приложения проверка типа файла происходит редко, что проблемы производительности метода 1 не являются вопрос.)