SkyDrive. Geo-Localización de fotos

Para obtener la geo-posición de una foto, tenemos que extraer la información Exif que se encuentra en ella y obtener las propiedades System.GPS.Latitude y System.GPS.Longitude.

Si trabajamos con fotos locales, la obtención de esa información es inmediata porque sólo tenemos que cargar en memoria el Bitmap y extraer la información de Exif de ella, bien mediante una librearía o utilizando WinRT (si estamos haciendo una aplicación Metro). El problema nos lo encontramos en la nube.

Cuando desarrollamos una aplicación que muestra las fotos que tenemos en SkyDrive, nos preocupamos bastante de minimizar la transferencia de datos y mostramos la imagen en modo thumbnail, siempre que nos sea posible. En Windows 8 sería tal como sigue:

// Inicializamos la conexión a SkyDrive utilizando oAuth
await InitAuth(true);
LiveConnectClient client = new LiveConnectClient(App.Session);
 
// Obtenemos los ficheros de album específico
LiveOperationResult pictureOperationResult = await client.GetAsync(album.UniqueId + "/files");
dynamic pictureResult = pictureOperationResult.Result;
foreach (dynamic item in pictureResult.data)
{
    var picture = new SkyDrivePicture();
    picture.UniqueId = item.id;
    picture.Title = item.name;
    
    // La propiedad picture tiene el thumbnail de la imagen, mientras que la propiedad source tiene la imagen completa
    picture.SetThumbnail(item.picture);
 
    items.Add(picture);
}

El problema es que los metadatos Exif no se encuentran en el thumbnail y esto nos obliga a descargar la imagen completa, hablamos de un mega y medio para imagenes de móviles, cargar en memoria el Bitmap de esa imagen y extraer la información Exif (no podemos utilizar el API de WinRT salvo que la guardemos a disco).

SkyDrive al rescate.

Revisando los objetos del API de SkyDrive tenemos la mejor solución. El objeto Photo, entre otras propiedades, la información que necesitamos: la localización de la foto en la propiedad location. ´

// item es el elemento dinámico Photo que obtenemos del Result de la consulta al album
if (item.location != null)
{
    picture.Latitude = item.location.latitude;
    picture.Longitude = item.location.longitude;
}

 

Aunque no tengamos todas las propiedades de Exif, si que podemos acelerar nuestro proceso ahorrando tiempo y descarga de datos leyendo estas propiedades y algunas otras que podamos tener, como la fecha en la que fue tomada la foto.

 

Saludos a todos…

Published 26/6/2012 9:39 por Alberto Diaz Martin
Archivado en: ,,
Comparte este post: