2009-07-28 25 views
7

Me gustaría encontrar el alto/ancho de una imagen en el disco sin abrirlo, si es posible (por razones de rendimiento).Leer propiedades de imagen extendida en C#

El panel de propiedades de Windows para imágenes contiene información como ancho, alto, profundidad de bits, etc., lo que me lleva a pensar que está almacenando metadatos en algún lugar del archivo. ¿Cómo puedo acceder a esta información?

+0

posible duplicado de [Cómo obtener los datos EXIF ​​de un archivo usando C#] (http: // stackoverflow.com/questions/58649/how-to-get-the-exif-data-from-a-file-using-c) – jgauffin

Respuesta

3

Hay algunas preguntas StackOverflow sobre cómo leer la información EXIF ​​de las imágenes, como por ejemplo: How to get the EXIF data from a file using C#

+0

Los datos EXIF ​​se almacenan dentro del archivo, por lo que sería necesario abrirlo. Lo cual no cumple con los criterios de OP, sin decir que los criterios de OP tengan sentido :) –

+0

Creo que el requisito del OP es más en la dirección en que quiere omitir la descompresión de la imagen y la memoria de asignación para los datos del mapa de bits. Si ese fuera el caso, acceder a metadatos está bien. –

+0

IMO quiere decir que no cargando los datos de la imagen real, abrir y leer los metadatos debería estar bien. De lo contrario, no hay formas de inspeccionar ese archivo. El cuello de botella real del rendimiento cargará los datos de la imagen, no los metadatos. – huseyint

3

La manera más fácil de lograr esto es, asumiendo que la imagen es cuadrada es tomar el tamaño del archivo en bytes y tomar la raíz cuadrada. Este será su ancho y alto.

256 bytes = 16px x 16px 

:-)

O bien, puede tratar de leer la información EXIF ​​de la imagen utilizando este codeplex library

+1

Gran suposición de que las imágenes son cuadradas. – SteveM

+2

Siempre me pregunté cómo Windows lo calculó tan rápido. – Brandon

+2

¡Guau! Las imágenes pueden no ser cuadradas. Hmmmmmm ¡esto le da una llave! ;) –

2

Windows no almacena (este) metadatos en ningún lugar especial en el sistema de archivos; la ventana Propiedades simplemente los lee del archivo de imagen en sí.

No creo que .NET ofrezca ninguna función para leer solo los metadatos de una imagen sin cargar toda la imagen. Si solo maneja un número limitado de formatos de imagen diferentes (por ejemplo, solo JPEG, PNG y GIF), no debería ser demasiado difícil leer el tamaño del encabezado de la imagen usted mismo.

Si, por otro lado, tiene que ocuparse de muchos formatos de imagen, tal vez pueda echar un vistazo al código fuente del Unix file utility. Se las arregla para detectar el tamaño de muchos, muchos formatos de imagen diferentes, y es increíblemente rápido para arrancar.

2

Con el fin de obtener el ancho y la altura de una imagen (en esencia, como usted dice, los metadatos) que se que abrir el archivo, analizar algún tipo de información de cabecera y obtener lo que quiere de esa manera.

No tendrá que leer toda la información de color/mapa de bits, solo el encabezado.

De la misma manera, Windows puede cargar iconos desde archivos de la aplicación sin ejecutarlos.

0

para leer las propiedades mostradas por el Explorador de Windows puede utilizar los controles de Microsoft Shell y Automatización componente. La ventaja de esto es que no necesita ninguna biblioteca de terceros (el objeto COM ya está allí) o código adicional para analizar el encabezado de la imagen y que funcionará con una variedad de formatos.

El código de ejemplo se puede encontrar en una respuesta a related question.

4

Use la clase System.Drawing.Image.

 Image img = Image.FromFile(fileName); 
     ImageFormat format = img.RawFormat; 
     Console.WriteLine("Image Type : "+format.ToString()); 
     Console.WriteLine("Image width : "+img.Width); 
     Console.WriteLine("Image height : "+img.Height); 
     Console.WriteLine("Image resolution : "+(img.VerticalResolution*img.HorizontalResolution)); 

     Console.WriteLine("Image Pixel depth : "+Image.GetPixelFormatSize(img.PixelFormat)); 
     Console.WriteLine("Image Creation Date : "+creation.ToString("yyyy-MM-dd")); 
     Console.WriteLine("Image Creation Time : "+creation.ToString("hh:mm:ss")); 
     Console.WriteLine("Image Modification Date : "+modify.ToString("yyyy-MM-dd")); 
     Console.WriteLine("Image Modification Time : "+modify.ToString("hh:mm:ss"));