Я не хочу полагаться на расширение файла. Мне не важно, какой это тип изображения (.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
, если файл недопустимого формата изображения. Использование вышеуказанного дает мне именно тот результат, который я хочу, однако я бы предпочел не использовать его по следующим причинам:
- Я считаю, что использование try-catch для нормального выполнения программы является плохой практикой по соображениям производительности.
Image.FromFile()
загружает в память весь файл изображения (если это файл изображения). Я предполагаю, что это расточительно, потому что мне нужен только тип файла, и на этом этапе моего кода мне не нужно выполнять какие-либо дальнейшие манипуляции с изображениями.- Мне не нравится ловить
OutOfMemoryException
s, потому что что, если есть РЕАЛЬНАЯ проблема нехватки памяти, и моя программа проглатывает ее и продолжает работать?
Есть ли более эффективные способы сделать это? Или все ли / все мои опасения, перечисленные выше, являются необоснованными?
Изменить: с тех пор, как я получил здесь ответы, я теперь знаю три решения:
- Load the whole image in memory via
Image.FromFile()
and a try-catch.- Pros: Does a deeper check against the image files contents; covers many image types.
- Минусы: самый медленный; накладные расходы от try-catch и загрузки полного файла изображения в память; потенциальная опасность от "реального" OutOfMemoryException.
- Check the header bytes of the image file.
- Pros: Quick, low memory usage.
- Минусы: потенциально хрупкий; нужно программировать для каждого типа файла.
- Check the file extension.
- Pros: Quickest; simplest.
- Минусы: работает не во всех ситуациях; проще всего ошибиться.
(Я не вижу явного «победителя», так как могу представить ситуацию, в которой каждый из них будет подходящим. Для целей моего приложения проверка типа файла происходит достаточно редко, чтобы проблемы с производительностью метода 1 не были проблемой.)