[Xojo 2024r3] Photos, Metadata y Ubicación en Imágenes iOS

A partir de Xojo 2024r3 es posible obtener los metadatos de las imágenes en las aplicaciones iOS, así como asignarles los datos de ubicación (Localización) y también guardar imágenes directamente en el álbum fotográfico del dispositivo.

Obtener los metadatos de una imagen

Para obtener los metadatos de una imagen el primer paso será obtener la instancia de Picture sobre la cual se va a actuar, utilizando para ello MobileImagePicker tal y como venías haciendo hasta ahora, empleando Photos o Camera como la fuentes de datos.

Una vez obtengamos una instancia válida, por ejemplo en el evento Selected de una instancia ImagePicker, sólo tendremos que acceder a la propiedad Metadata, la cual nos devolverá un diccionario sobre cuyas entradas podremos iterar o bien convertirlo a JSON si nos resulta más sencillo. Por ejemplo, si tenemos en cuenta que “pic” es el parámetro sobre el que hemos recibido la imagen seleccionada en el evento Selected de ImagePicker:

Var js As JSONItem

Try
  js = New JSONItem(pic.Metadata)
  MessageBox js.ToString
Catch e As JSONException

End Try

El anterior fragmento de código nos mostrará un diálogo con todos los metadatos asociados con la imagen.

Obtener la Ubicación… y situarla en el mapa

Una acción interesante podría ser la de leer los datos de ubicación de la imagen seleccionada (en el caso de que tenga) y añadir una entrada sobre una instancia de MobileMapViewer. Así, por ejemplo nuevamente en el evento Selected de una instancia ImagePicker podríamos añadir el siguiente fragmento de código:

If pic <> Nil Then
  ImageViewer.Image = pic
  
  // The metadata is retrieved as a Dictionary, so let's get the
  // metadata from the selected picture
  metadata  = pic.Metadata
  
  If metadata <> Nil Then
    Var jlocation As Dictionary = metadata.Lookup("Location", Nil)
    
    // Getting the Location information (also as Dictionary)
    If jlocation <> Nil Then
      
      // And assigning the Latitude and Longitude
      // values to the properties
      latitude  = jlocation.value("Latitude").DoubleValue
      longitude = jlocation.value("Longitude").DoubleValue
      
      // Then, we will show the Picture location on the Map
      timer.CallLater(100, AddressOf showlocation)
    End If
    
    
  End If
  
End If

Latitude y Longitude son propiedades de tipo Double que se habrán añadido a la pantalla (Screen) que contiene la instancia de ImagePicker, además de una instancia de ImageViewer encargada de mostrar el previo de la imagen seleccionada y una instancia MapViewer sobre la cual se añadirá la “chincheta” correspondiente a la ubicación de la imagen.

Como puedes ver se hace uso del método compartido CallLater de la clase Timer para que se invoque el método ShowLocation. Dicho método será el encargado de mostrar la chincheta propiamente dicha sobre el mapa:

Private Sub Showlocation()
// Let's create a new Location instance from the stored
// latitude and longitude values in order to add it
// to the Mapviewer…

Var maplocation As New MapLocation(latitude, longitude)
MapViewer1.AddLocation( maplocation )

// …and let's make sure the metadata is updated
// to the viewed image
ImageViewer.Image.Metadata = metadata
End Sub

El resultado tras seleccionar una imagen en el dispositivo del usuario será similar al que puedes ver en la siguiente captura de pantalla:

Por supuesto, tendrás que activar el entitlement correspondiente a Maps en el inspector Build Settings > iOS > Capabilities.

Asignar una Ubicación a la Imagen

Del mismo modo que podemos obtener la ubicación de una imagen, también podremos modificarla… o bien asignar una ubicación a aquellas fotografías que obtengamos mediante ImagePicker utilizando la fuente Camera. Asignar una ubicación es bien sencillo:

  • Hemos de añadir una instancia de MobileLocation al proyecto (por ejemplo la pantalla donde gestionemos la captura de imágenes).
  • Añadiremos las propiedades Latitude y Longitude de tipo Double como dos nuevas propiedades en la misma pantalla.
  • En el evento LocationChanged de la instancia MobilLocation asignaremos los valores recibidos en los parámetros Latitude y Longitude a las propiedades creadas anteriormente:
Self.Latitude = Latitude
Self.Longitude = Longitude
  • Luego, en el evento Selected de la instancia ImagePicker utilizaremos el siguiente fragmento de código:
Var d As New Dictionary
d.Value("Latitude") = self.Latitude
d.Value("Longitude") = self.Longitude

Var Location As New Dictionary
Location.Value("Location") = d

pic.Metadata = d

Guardar Imágenes en Photos

Hasta ahora MobileSharingPanel era probablemente la opción utilizada cuando se trataba de guardar cualquiera de las imágenes generadas en tu app iOS Xojo o bien las imágenes capturadas con la cámara mediante el ImagePicker. A partir de Xojo 2024r3 también podrás utilizar el método SaveToPhotos de la clase Picture, y que se encargará de guardar la imagen preservando los metadatos asociados.

Así, por ejemplo, sólo tendrás que añadir la siguiente línea de código al final del anterior bloque para que la imagen capturada se guarde con la ubicación:

pic.SaveToPhotos(Picture.Formats.PNG)

Eso sí, cuando utilices dicho método sobre las imágenes en tu aplicación iOS asegúrate de activar la capacidad Photos Access en el panel inspector Build Settings > iOS > Capabilities.

Conclusiones

Como has visto, ahora es realmente sencillo obtener los metadatos de las instancias Picture (imágenes) en tus aplicaciones iOS, así como aprovechar la información de Ubicación o bien asignar la información de ubicación sobre cualquiera de las imágenes existentes o bien nuevas imágenes. Además, ya no será preciso recurrir a MobileSharingPanel si todo lo que deseas es que tu aplicación iOS guarde las imágenes en el álbum de la aplicación Photos sobre el dispositivo iOS.

Deja un comentario

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