Я не хочу полагаться на расширение файла. Я не хочу знать, какой тип изображения (.jpg, .png и т. Д.), Я просто хочу знать, является ли файл изображением или нет. Я бы предпочел не использовать DLL-файлы не .NET, если это возможно.Как определить, является ли файл файлом изображения в .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
, если файл не является допустимым формат изображения. Использование выше дает мне именно тот результат, я хочу, однако я предпочел бы не использовать его по следующим причинам:
- Это мое убеждение в том, что с помощью Try-уловов для нормального выполнения программы является плохой практикой по соображениям производительности.
Image.FromFile()
загружает весь файл изображения (если это файл изображения) в память. Это расточительно, я предполагаю, потому что мне нужен только тип файла и не нужно делать никаких дальнейших манипуляций с изображением на этом этапе моего кода.- Мне не нравится ловить
OutOfMemoryException
, потому что, если есть РЕАЛЬНАЯ проблема с памятью, и моя программа проглатывает ее и продолжает идти?
Есть ли лучшие способы сделать это? Или, все или все перечисленные выше проблемы необоснованны?
Edit: После получения ответов здесь, эти три решения теперь я в курсе:
- Загрузите все изображения в памяти через
Image.FromFile()
и примерку улов.- Профи: Проводит более глубокую проверку содержимого содержимого изображений; охватывает многие типы изображений.
- Против: Slowest; накладные расходы от попытки захвата и загрузки полного файла изображения в память; потенциальная опасность от ловли «реального» исключения OutOfMemoryException.
- Проверьте байты заголовка файла изображения.
- Достоинства: Быстрый, низкий объем памяти.
- Против: потенциально хрупкий; необходимо запрограммировать для каждого типа файла.
- Проверьте расширение файла.
- Прос: Самый быстрый; Простейшие.
- Против: Не работает во всех ситуациях; наиболее легко неправильно.
(я не вижу четкий «победителя», так как я могу представить себе ситуацию, в которой каждый из них будет уместно. Для целей моего приложения, проверка типа файла происходит достаточно редко, что касается производительности метод 1 не является проблемой.)
Смотрите также: http://stackoverflow.com/questions/670546/determine-if-file-is-an-image – Daryl
Смотрите также # 2 : http://stackoverflow.com/questions/210650/validate-image-from-file-in-c-sharp – Daryl
См. также # 3: http://stackoverflow.com/questions/55869/determine-file-type- of-an-image – Daryl