Prendre la date d'une photo choisie dans la librairie

Bonsoir,

Après quelques recherches sur internet, je ne trouve pas de solutions que je comprends.
Je suis assez débutant dans la programmation.

Je cherche, comme le titre l’indique, à choisir une photo dans ma librairie de photos ( avec UIImagePickerController) et, suite à ce choix, récupérer la photo, mais également la date à laquelle cette photo a été prise.

J’arrive sans soucis à prendre la photo, l’afficher, etc…
Pour la date, j’ai lu certaine choses sur la classe “PHAsset” et le framework “Photos”, mais je n’arrive pas à mon but.

Merci d’avance pour votre aide! :slight_smile:

Bonjour Louis,

la manipulation des images/photos par iOS n’est pas le sujet le plus simple :slight_smile: Sur les anciennes versions de iOS je sais que les metadonnées n’étaient accessibles que sur les photos prises en direct et pour les photos prises depuis la librairie c’était beaucoup plus limité.
Ils ont changé beaucoup de choses avec le nouveau framework Photo donc espérons que maintenant c’est mieux. Normalement il te faut récupérer un PHAsset pour ta photo et ensuite tu as accès à cette propriété : https://developer.apple.com/documentation/photos/phasset/1624776-creationdate

Merci, je vais regarder à ça, et si j’y arrive, je mettrai les différentes étapes pour y arriver ! :slight_smile:

2 « J'aime »

Voila, après pas mal de recherches, et un peu d’aide, j’ai trouvé une solution :slight_smile:

Je ne sais pas si ça se fait comme ça, mais je vais expliquer les étapes par lesquelles je suis passé.

Je suis parti de la fonction qui permet d’aller chercher les image avec le pickerView ( qui est facilement trouvable sur diverses tuto) :

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
    
    if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage! {
        imageView.image = pickedImage
         }

Au début, j’ai simplement changé le « as? UIImage! » par un « as? PHAsset » ( voir documentation donnée par @mbritto )

J’ai alors essayé de prendre la date de création du pickedImage et ajouté des labels pour tester que je récupérais quelque chose.

if let pickedImage = info[UIImagePickerControllerMediaMetadata] as?
 PHAsset {
 testDate = pickedImage.creationDate
 label1.text = ":\(testDate)"
 label2.text = "coucou"
 print(testDate)

 //imageView.image = pickedImage

Malheureusement, rien ne se passait de cette manière, je ne récupérais aucune donnée, et pire, même mon label2 ne bougeait pas : ce qui signifiait que je ne passais même pas dans le if let.

Après avoir reçu une aide, j’ai en fait compris qu’il fallait que j’aille d’abord recherché l’asset avant de pouvoir piocher dedans la date de création.

La fonction firstObject est une boolean et sert à renvoyer un true si la classe possède un premier objet, et false si pas.

ET donc, la solution pour avoir la date de création est :

let assets = PHAsset.fetchAssets(withALAssetURLs:[ info[UIImagePickerControllerReferenceURL] as! URL], options: nil)
    if let imageasset = assets.firstObject {
        testDate = imageasset.creationDate
        label1.text = ":\(testDate)"
        label2.text = "coucou"
    }
    if let pickedImage = info[UIImagePickerControllerMediaMetadata] as?
        PHAsset {
    testDate = pickedImage.creationDate
        label1.text = ":\(testDate)"
        label2.text = "coucou"
        print(testDate)
      
    }
    dismiss(animated: true, completion: nil)
    
}

J’espère ne pas avoir été trop long , et comme ça fonctionne, mais que je n’ai pas encore totalement tout compris, si quelqu’un à quelque chose à rajouter/ modifier, qu’il n’hésite pas à faire part de son avis !

Maintenant je vais essayer de faire ça, mais avec la sélection de plusieurs photos en une fois et je veux récupérer à la fois les photos, mais les dates correspondantes également ! ( si quelqu’un a une idée ?)

Merci beaucoup pour l’aide @mbritto

Tu es sûr que les 2 procédures sont necessaires ? le fetchAssets ne marche pas tout le temps ?
Si la seconde solution est une solution de repli, alors il te faudrait un else entre les 2 pour éviter de la faire inutilement si tu as déjà obtenu ton asset lors du premier essai

1 « J'aime »

En effet @mbritto,
Voila, la deuxième partie était inutile

func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {

    let assets = PHAsset.fetchAssets(withALAssetURLs:[ info[UIImagePickerControllerReferenceURL] as! URL], options: nil)
    if let imageasset = assets.firstObject {
        testDate = imageasset.creationDate
        datePhoto.text = ":\(testDate)"
        test.text = "coucou"
    }
    dismiss(animated: true, completion: nil)
    
}