Como posso determinar se um arquivo é um arquivo de imagem no .NE
Não quero confiar na extensão do arquivo. Não quero saber que tipo de imagem é (.jpg, .png etc.). Quero apenas saber se o arquivo é uma imagem ou não. Prefiro não usar dlls que não sejam do .NET, se possíve
A melhor maneira de saber como fazer isso é o seguinte:
bool isImageFile;
try
{
Image.FromFile(imageFile).Dispose();
isImageFile = true;
}
catch (OutOfMemoryException)
{
isImageFile = false;
}
Conforme observado aqui:http: //msdn.microsoft.com/en-us/library/stf701f5.asp, Image.FromFile()
lança umOutOfMemoryException
se o arquivo não for um formato de imagem válido. Usando o acima me dá exatamente o resultado que eu quero, no entanto, prefiro não usá-lo pelos seguintes motivos:
Image.FromFile()
carrega o arquivo de imagem inteiro (se for um arquivo de imagem) na memória. Isso é um desperdício, presumo, porque eu só preciso do tipo de arquivo e não preciso mais manipular imagens neste momento do meu códig Eu não gosto de pegarOutOfMemoryException
porque o que acontece se houver um problema REAL de falta de memória e meu programa o engole e continuExiste alguma maneira melhor de fazer isso? Ou alguma / todas as minhas preocupações listadas acima são injustificadas?
Editar Desde que recebemos as respostas aqui, estas são as três soluções Agora estou ciente de:
Carregue a imagem inteira na memória viaImage.FromFile()
e um try-catch. Pros: Faz uma verificação mais profunda do conteúdo dos arquivos de imagem; abrange muitos tipos de imagens. Contras: Mais lento; sobrecarga de try-catch e carregamento de arquivo de imagem completo na memória; risco potencial de pegar uma OutOfMemoryException 'real'. Verifique os bytes do cabeçalho do arquivo de image Pros: Uso rápido e com pouca memóri Contras: potencialmente quebradiço; precisa programar para cada tipo de arquivo. Verifique a extensão do arquiv Pros: Mais rápido; mais simples. Contras: Não funciona em todas as situações; mais facilmente errado.(Não vejo um "vencedor" claro, pois posso imaginar uma situação em que cada um seria apropriado. Para os fins do meu aplicativo, a verificação do tipo de arquivo ocorre com pouca frequência, de modo que os problemas de desempenho do método 1 não foram um problema. )