2008-09-12 55 views
61

Me gustaría escribir un pequeño programa en C# que pase por mis fotos JPEG y, por ejemplo, las clasifique en carpetas fechadas (usando MIS convenciones de citas, maldición ...)Cómo obtener los datos EXIF ​​de un archivo usando C#

¿Alguien conoce una forma relativamente fácil de obtener los datos EXIF ​​como la fecha y la hora o la exposición de forma programática? Gracias!

+0

El soporte integrado del BCL para los metadatos de imágenes es bastante limitado. He estado trabajando con metadatos como Exif desde 2002 y tengo una biblioteca simple pero potente [para extraer tales datos para .NET] (https://github.com/drewnoakes/metadata-extractor-dotnet). –

Respuesta

3

Obtener los datos EXIF ​​de una imagen JPEG implica:

  1. Buscando a los marcadores JPEG que se menciona el principio de los datos EXIF ​​,. p.ej. Normalmente, oxFFE1 es el marcador insertado mientras se codifican los datos EXIF, que es un segmento APPlication, donde van los datos EXIF.
  2. Analizar todos los datos de decir 0xFFE1 a 0xFFE2. Esta información sería una secuencia de bytes, en el archivo codificado JPEG.
  3. equivalente ASCII de estos bytes contendría información diversa relacionada con la imagen de la fecha, la cámara Nombre del modelo, la exposición etc ...
5

clase Imagen tiene PropertyItems y propiedades PropertyIdList. Puedes usarlos.

+0

Parece que es de solo lectura, por lo que no puedo agregar ninguno en la nueva Imagen ... – TigrouMeow

+3

Use la función Image.SetPropertyItem (PropertyItem) en la nueva imagen. –

9

Echa un vistazo a este metadata extractor. Está escrito en Java pero también ha sido portado a C#. He utilizado la versión de Java para escribir una pequeña utilidad para cambiar el nombre de mis archivos jpeg en función de las etiquetas de fecha y modelo. Muy fácil de usar


EDITARmetadatos extractora es compatible con .NET también. Es una biblioteca muy rápida y simple para acceder a los metadatos de imágenes y videos.

Es totalmente compatible con Exif, así como IPTC, XMP y muchos otros tipos de metadatos de los tipos de archivo, incluyendo JPEG, PNG, GIF, PNG, ICO, WebP, PSD, ...

var directories = ImageMetadataReader.ReadMetadata(imagePath); 

// print out all metadata 
foreach (var directory in directories) 
foreach (var tag in directory.Tags) 
    Console.WriteLine($"{directory.Name} - {tag.Name} = {tag.Description}"); 

// access the date time 
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault(); 
var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTime); 

Es disponible a través de NuGet y code's on GitHub.

9

Aquí hay un enlace a otro similar SO question, que tiene una respuesta que apunta a este buen artículo en "Reading, writing and photo metadata" en .Net.

+0

Una pregunta alternativa con ** muy buena respuesta ** [está aquí] (https://stackoverflow.com/q/10494796/2803565) que apunta a [ExifLib - Un extractor rápido de datos Exif para .NET 2.0 +] (https : //www.codeproject.com/Articles/36342/ExifLib-A-Fast-Exif-Data-Extractor-for-NET-2-0) –

40

Como se sugiere, puede utilizar una biblioteca de terceros, o hacerlo manualmente (lo cual no es mucho trabajo), pero la más simple y la más flexible es tal vez usar la funcionalidad incorporada en .NET. Para más información, véase:

digo "que es el más flexible" porque .NET no pretende interpretar o unir los datos de cualquier manera. Para cada EXIF ​​básicamente obtienes una matriz de bytes. Esto puede ser bueno o malo dependiendo de la cantidad de control que realmente desee.

Además, debo señalar que la lista de propiedades en realidad no corresponde directamente con los valores EXIF. EXIF se almacena en varias tablas con identificaciones superpuestas, pero .NET pone todo en una lista y redefine las ID de algunos elementos. Pero siempre y cuando no te importen las ID EXIF ​​precisas, deberías estar bien con la asignación de .NET.

+8

El acceso a Bitmap.PropertyItems requiere leer todo el archivo en la memoria. Si crea un mapa de bits, accede a PropertyItems y no hace nada más, puede usar XPerf para ver que su aplicación accedió al archivo de imagen y leerlo todo en la memoria. Para mi computadora, un archivo de 3.4mb cuesta> 700ms en IO, solo para obtener EXIF ​​a través de PropertyItems :(. – Tristan

+4

En comparación, el PhotoViewer de Picasa solo lee 20 - 30k de cada archivo que toca. Esas lecturas cuestan solo ~ 25ms. Wow; Me encantaría chatear con el chico/chica que escribió esas cosas. (Los datos fueron recolectados al crear el inicio de PhotoViewer usando XPerf) – Tristan

+0

@Tristan: información útil, sin embargo, ¿con qué frecuencia accedes a los metadatos de la imagen sin querer también la imagen? ? Estoy seguro de que hay algunos casos, pero creo que en la mayoría de los casos, uno estaría mostrando la imagen (o trabajando con sus datos) Y sus metadatos al mismo tiempo. – jrista

6

Puede usar TagLib# que es utilizado por aplicaciones como F-Spot. Además de Exif, leerá una buena cantidad de formatos de metadatos para imagen, audio y video.

También me gusta ExifUtils API pero tiene errores y no se desarrolla activamente.

3

La herramienta de línea de comandos ExifTool by Phil Harvey funciona con docenas de formatos de imágenes, incluidos muchos formatos RAW patentados, y puede manipular una variedad de formatos de metadatos, incluidos EXIF, GPS, IPTC, XMP, JFIF.

Aplicación muy fácil de usar, liviana e impresionante.

+0

ExifTool es una sorprendente herramienta/lib, pero está escrita en Perl, por lo que utilizarla desde C# implica iniciar un proceso externo. –

Cuestiones relacionadas