Saltar al contenido

Obtener datos GPS del EXIF ​​de una imagen en C#

Ten en cuenta que en las ciencias cualquier problema casi siempere puede tener más de una soluciones, de igual modo aquí mostraremos lo más óptimo y eficiente.

Solución:

Según el enlace publicado anteriormente por tomfanning, el elemento de propiedad 0x0002 es la latitud expresada como PropertyTagTypeRational. El tipo racional se define como…

Especifica que el miembro de datos de valor es un array de pares de enteros largos sin signo. Cada par representa una fracción; el primer entero es el numerador y el segundo entero es el denominador.

Estás tratando de analizarlo como un string cuando en realidad es solo una serie de bytes. De acuerdo con lo anterior, debe haber 3 pares de enteros sin signo de 32 bits empaquetados en ese byte arrayque puede recuperar usando lo siguiente:

uint degreesNumerator   = BitConverter.ToUInt32(propItem.Value, 0);
uint degreesDenominator = BitConverter.ToUInt32(propItem.Value, 4);
uint minutesNumerator   = BitConverter.ToUInt32(propItem.Value, 8);
uint minutesDenominator = BitConverter.ToUInt32(propItem.Value, 12);
uint secondsNumerator   = BitConverter.ToUInt32(propItem.Value, 16);
uint secondsDenominator = BitConverter.ToUInt32(propItem.Value, 20);

Lo que haces con estos valores después de que los tienes es para que lo resuelvas 🙂 Esto es lo que dicen los documentos:

La latitud se expresa como tres valores racionales que dan los grados, minutos y segundos respectivamente. Cuando se expresan grados, minutos y segundos, el formato es dd/1, mm/1, ss/1. Cuando se utilizan grados y minutos y, por ejemplo, se dan fracciones de minutos hasta dos decimales, el formato es dd/1, mmmm/100, 0/1.

Una forma simple (¡y rápida!) es usar mi código abierto Extractor de metadatos biblioteca:

var gps = ImageMetadataReader.ReadMetadata(path)
                             .OfType()
                             .FirstOrDefault();

var location = gps.GetGeoLocation();

Console.WriteLine("Image at 0,1", location.Latitude, location.Longitude);

La biblioteca está escrita en C# puro y admite muchos formatos de imagen y decodifica datos específicos de muchos modelos de cámaras.

Está disponible a través de NuGet o GitHub.

Me encontré con esto buscando una manera de obtener los datos GPS EXIF ​​como un conjunto de flotadores. He adaptado el código de Jon Grant de la siguiente manera…

public static float? GetLatitude(Image targetImg)

    try
    
        //Property Item 0x0001 - PropertyTagGpsLatitudeRef
        PropertyItem propItemRef = targetImg.GetPropertyItem(1);
        //Property Item 0x0002 - PropertyTagGpsLatitude
        PropertyItem propItemLat = targetImg.GetPropertyItem(2);
        return ExifGpsToFloat(propItemRef, propItemLat);
    
    catch (ArgumentException)
    
        return null;
    

public static float? GetLongitude(Image targetImg)

    try
    
        ///Property Item 0x0003 - PropertyTagGpsLongitudeRef
        PropertyItem propItemRef = targetImg.GetPropertyItem(3);
        //Property Item 0x0004 - PropertyTagGpsLongitude
        PropertyItem propItemLong = targetImg.GetPropertyItem(4);
        return ExifGpsToFloat(propItemRef, propItemLong);
    
    catch (ArgumentException)
    
        return null;
    

private static float ExifGpsToFloat(PropertyItem propItemRef, PropertyItem propItem)

Si te gusta la programación, puedes dejar un ensayo acerca de qué le añadirías a este artículo.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *