No quiero depender de la extensión de archivo. No me importa saber qué tipo de imagen es (.jpg, .png, etc.), simplemente quiero saber si el archivo es una imagen o no. Preferiría no usar dlls que no sean .NET si es posible.¿Cómo puedo determinar si un archivo es un archivo de imagen en .NET?
La mejor manera que sé cómo hacer esto es el siguiente:
bool isImageFile;
try
{
Image.FromFile(imageFile).Dispose();
isImageFile = true;
}
catch (OutOfMemoryException)
{
isImageFile = false;
}
Como se ha señalado aquí: http://msdn.microsoft.com/en-us/library/stf701f5.aspx, Image.FromFile()
lanza una OutOfMemoryException
si el archivo no es un formato de imagen válida. Utilizando lo anterior me da exactamente el resultado que quiero, sin embargo yo prefiero no usarlo por las siguientes razones:
- Es mi creencia de que el uso de Try-capturas para la ejecución normal del programa es una mala práctica por razones de rendimiento.
Image.FromFile()
carga todo el archivo de imagen (si es un archivo de imagen) en la memoria. Esto es un desperdicio, supongo, porque solo necesito el tipo de archivo y no necesito hacer más manipulación de la imagen en este punto de mi código.- No me gusta atrapar
OutOfMemoryException
s porque, ¿qué ocurre si hay un problema REAL de memoria insuficiente y mi programa se lo traga y sigue funcionando?
¿Hay alguna forma mejor de hacerlo? O, ¿Alguna de mis inquietudes enumeradas anteriormente no está justificada?
Editar: Desde la recepción de las respuestas aquí, estos son los tres soluciones Ahora estoy consciente de:
- carga toda la imagen en la memoria a través de
Image.FromFile()
y un try-catch.- Pros: Hace una comprobación más profunda contra el contenido de los archivos de imagen; cubre muchos tipos de imágenes.
- Contras: Más lento; sobrecarga desde try-catch y cargando el archivo de imagen completo en la memoria; peligro potencial de atrapar una 'OutOfMemoryException' real.
- Compruebe los bytes del encabezado del archivo de imagen.
- Pros: Rápido, bajo uso de memoria.
- Contras: potencialmente frágil; necesita programar para cada tipo de archivo.
- Compruebe la extensión del archivo.
- Pros: Más rápido; más simple
- Contras: No funciona en todas las situaciones; lo más fácil es equivocado
(no veo un "ganador" clara ya que puedo imaginar una situación en la que cada uno sería apropiado. Para los propósitos de mi solicitud, la comprobación de tipos de archivos sucede bastante infrecuente que los problemas de rendimiento de método 1 no eran un problema.)
Ver también: http://stackoverflow.com/questions/670546/determine-if-file-is-an-image – Daryl
Ver también # 2 : http://stackoverflow.com/questions/210650/validate-image-from-file-in-c-sharp – Daryl
Vea también # 3: http://stackoverflow.com/questions/55869/determine-file-type- de-una-imagen – Daryl