mantenía una simple open-source library desde 2002 para extraer metadatos de los archivos de imagen/vídeo.
// Read all metadata from the image
var directories = ImageMetadataReader.ReadMetadata(stream);
// Find the so-called Exif "SubIFD" (which may be null)
var subIfdDirectory = directories.OfType<ExifSubIfdDirectory>().FirstOrDefault();
// Read the DateTime tag value
var dateTime = subIfdDirectory?.GetDateTime(ExifDirectoryBase.TagDateTimeOriginal);
En mis puntos de referencia, este código se ejecuta más de 12 veces más rápido que Image.GetPropertyItem
, y alrededor de 17 veces más rápido que la API de WPF JpegBitmapDecoder
/BitmapMetadata
.
Hay una tonelada de información adicional disponible de la biblioteca como ajustes de la cámara (F-stop, ISO, velocidad de obturación, modo de flash, distancia focal, ...), propiedades de la imagen (dimensiones, configuraciones de píxeles) y otras cosas como posiciones de GPS, palabras clave, información de copyright, etc.
Si solo está interesado en los metadatos, usar esta biblioteca es muy rápido ya que no decodifica la imagen (es decir, mapa de bits).Puede escanear miles de imágenes en unos segundos si tiene un almacenamiento lo suficientemente rápido.
ImageMetadataReader
comprende muchos tipos de archivos (JPEG, PNG, GIF, BMP, TIFF, PCX, WebP, ICO, ...). Si sabe que usted está tratando con JPEG, y que sólo se desea que los datos Exif, entonces usted puede hacer el proceso más rápido de lo siguiente:
var directories = JpegMetadataReader.ReadMetadata(stream, new[] { new ExifReader() });
La bibliotecametadatos extractora está disponible a través de NuGet y code's on GitHub. Gracias a todos los colaboradores increíbles que han mejorado la biblioteca y enviado imágenes de prueba a lo largo de los años.
Después de algunas pruebas descubrí que su respuesta es la mejor. Gracias. – Sergio
Ahora solo si hubiera hecho una comprobación para ver si existe primero. Siempre hay una posibilidad de que esta propiedad no lo haga. –
¡Gran solución! El control de propiedad es importante. Si agrega if (myImage.PropertyIdList.Any (x => x == 36867)) como su verificación, ¡funciona de maravilla! –