Non voglio fare affidamento sull'estensione del file. Non mi interessa sapere che tipo di immagine è (.jpg, .png, ecc.), Voglio semplicemente sapere se il file è un'immagine o meno. Preferirei non utilizzare eventuali dll non.NET, se possibile.Come posso determinare se un file è un file immagine in .NET?
Il modo migliore che conosco come fare questo è la seguente:
bool isImageFile;
try
{
Image.FromFile(imageFile).Dispose();
isImageFile = true;
}
catch (OutOfMemoryException)
{
isImageFile = false;
}
Come notato qui: http://msdn.microsoft.com/en-us/library/stf701f5.aspx, Image.FromFile()
genera OutOfMemoryException
se il file non è un formato immagine valido. Utilizzando quanto sopra mi dà esattamente il risultato che voglio, però io preferisco non usarlo per le seguenti ragioni:
- E 'mia convinzione che l'utilizzo di try-catture per la normale esecuzione del programma è una cattiva pratica per motivi di prestazioni.
Image.FromFile()
carica l'intero file di immagine (se è un file di immagine) nella memoria. Questo è uno spreco presumo perché ho solo bisogno del tipo di file e non ho bisogno di fare ulteriori manipolazioni di immagine a questo punto nel mio codice.- Non mi piace prendere lo
OutOfMemoryException
s perché se c'è un vero problema di memoria esaurita e il mio programma lo inghiotte e continua a funzionare?
Ci sono modi migliori per fare questo? Oppure, sono alcuni/tutti i miei dubbi sopra elencati ingiustificati?
Edit: Da quando abbiamo ricevuto le risposte qui, queste sono le soluzionitre Ora sono a conoscenza di:
- carico l'intera immagine in memoria tramite
Image.FromFile()
e un try-catch.- Pro: esegue un controllo più approfondito del contenuto dei file di immagine; copre molti tipi di immagine.
- Contro: Più lento; sovraccarico di try-catch e caricamento di file immagine completi in memoria; potenziale pericolo derivante da una "reale" OutOfMemoryException.
- Controllare i byte di intestazione del file immagine.
- Pro: utilizzo della memoria basso e veloce.
- Contro: potenzialmente fragile; bisogno di programmare per ogni tipo di file.
- Controllare l'estensione del file.
- Pro: Più rapido; più semplice.
- Contro: non funziona in tutte le situazioni; più facilmente sbagliato.
(non vedo un chiaro "vincitore" dal momento che posso immaginare una situazione in cui ognuno sarebbe appropriato. Per gli scopi della mia applicazione, il controllo del tipo di file accade abbastanza di rado che i problemi di prestazioni di metodo 1 non erano un problema.)
Vedi anche: http://stackoverflow.com/questions/670546/determine-if-file-is-an-image – Daryl
Vedi anche 2 # : http://stackoverflow.com/questions/210650/validate-image-from-file-in-c-sharp – Daryl
Vedere anche # 3: http://stackoverflow.com/questions/55869/determine-file-type- of-an-image – Daryl