Bonjour tout le monde! 
Je suis occupé d’essayer de récupérer le path d’une image prise avec imagePickerController, mais rien à faire…
J’ai cherché un peu, et j’ai vu qu’il fallait d’abord sauvegarder l’image avant de pouvoir récupérer son chemin ?
Mon code jusqu’ici:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
imagePicker.dismiss(animated: true, completion: nil)
imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage
UIImageWriteToSavedPhotosAlbum(info[UIImagePickerControllerOriginalImage] as! UIImage, nil, nil, nil)
}
L’image s’enregistre bien dans mes photos sur mon iPhone, mais lorsque j’essaye de récupérer son chemin avec ça, par exemple:
let imageURL = info[UIImagePickerControllerReferenceURL] as! NSURL
Il me trouve automatiquement “nil” (même si je déballe l’optionnel)…
Est-ce que vous avez une idée ?
Merci,
Alexandre.
Ah la gestion des photos et de la bibliothèque de photos…toujours un régal!
En fait, c’est souvent compliqué d’avoir un chemin de fichiers car dans certains car tu n’y a pas accès.
Si tu as de la chance tu auras le chemin dans cette propriété :
info[UIImagePickerControllerMediaURL]
au format NSURL
Sinon tu peux avoir accès à l’asset URL qui te permettra de récupérer un objet PHAsset, puis d’obtenir ses données binaires (NSData) via la propriété info[UIImagePickerControllerReferenceURL]
Sinon dernière solution, tu peux utiliser la fonction UIImageJPEGRepresentation qui te permettra d’obtenir du NSData à partir de ton UIImage en la réencodant en JPG.
Une fois que tu as du NSData (via le assets url ou via le réencodage JPG) tu peux écrire ces données binaires dans un fichier pour avoir un chemin utilisable.
Au final ce n’est pas la partie la plus fun du SDK 
Bonjour Maxime,
Ouille, ça ne m’a pas l’air aussi facile que tout ce que j’ai vu jusque maintenant!
Si je pars sur l’asset URL pour récupérer les données binaires pour les stocker dans un fichier, et donc après avoir le path, cela veut dire que la photo sera: dans un fichier ET dans la librairie de photos ?
Pour le moment, j’ai ceci:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let img = info[UIImagePickerControllerOriginalImage] as? UIImage
UIImageWriteToSavedPhotosAlbum(img!, nil, nil, nil)
if let url:NSURL = info[UIImagePickerControllerMediaURL] as? NSURL {
print(url.absoluteString)
} else {
print("ERREUR")
}
imagePicker.dismiss(animated: true, completion: nil)
}
Malheureusement, ça passe par l’affichage de “ERREUR”…
Je vais donc devoir m’orienter vers la seconde possibilité ?
N’est t’il pas possible, par exemple, qu’une fois qu’on ai pris une photo, et qu’on l’a sauvegardé dans la librairie de photos, de directement récupérer la dernière photo et de la, pouvoir trouver son path pour la stocker dans la DB ? Ou peut-être que ce n’est pas conseillé ?
Merci pour tes explications,
Bonne journée,
Alexandre.
Justement, ça dépend des fois, tu peux avoir accès à l’url du fichier si tu as de la chance mais sinon tu vas devoir utiliser une des 2 autres méthodes (l’asset url ou le réencodage JPG).
Ca ne dépend pas de toi mais du téléphone de l’utilisateur : des fois il s’agit d’une photo en local, des fois ça vient de iCloud, etc. Mes souvenirs sont assez flous mais je me rappelle que j’avais dû gérer chacun des 3 cas qui se présentaient.
Ca a peut être évolué depuis mais je me rappelle que sur iOS 8 et 9 c’était comme ça.
Voici un extrait du code que j’avais fait :
var shouldWriteImageDataToFile = false
if let fileUrl:NSURL = info[UIImagePickerControllerMediaURL] as? NSURL {
_selectedPicturePath = fileUrl.absoluteString
} else if let assetLibUrl:NSURL = info[UIImagePickerControllerReferenceURL] as? NSURL {
copyLibraryAssetToTmpFile(assetLibUrl)
} else {
shouldWriteImageDataToFile = true
}
if let image:UIImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
_selectedImage = image
if (shouldWriteImageDataToFile) {
writeImageToTempFile(image, fileName: "user_photo.jpg")
}
}
Merci, je vais encore creuser dans cette direction, les photos me semblent êtres plutôt intéressant pour certaines applications actuelles! 
Bonjour tout le monde, et bonjour Maxime,
A force de chercher à gauche à droite, voici un code que j’ai trouvé, et qui fonctionne:
func saveToCameraRoll(image: UIImage, completion: @escaping (URL?) -> Void) {
var placeHolder: PHObjectPlaceholder? = nil
PHPhotoLibrary.shared().performChanges({
let creationRequest = PHAssetChangeRequest.creationRequestForAsset(from: image)
placeHolder = creationRequest.placeholderForCreatedAsset!
}, completionHandler: { success, error in
guard success, let placeholder = placeHolder else {
completion(nil)
return
}
let assets = PHAsset.fetchAssets(withLocalIdentifiers: [placeholder.localIdentifier], options: nil)
guard let asset = assets.firstObject else {
completion(nil)
return
}
asset.requestContentEditingInput(with: nil, completionHandler: { (editingInput, _) in
completion(editingInput?.fullSizeImageURL)
})
})
}
et on peut l’utiliser avec:
saveToCameraRoll(image: img!) {
print("URL: \(String(describing: $0))")
}
Ce qui m’affiche en console:
URL: Optional(file:///var/mobile/Media/DCIM/101APPLE/IMG_1359.JPG)
Cependant, même si ce code-ci fonctionne, il y a pas mal de notation que je n’ai jamais vue en swift, et je ne comprends pas bien ce que fait ce code… Alors, au lieu de l’utiliser les yeux fermés, j’aimerai comprendre ce qui se passe avec cette fonction, est-ce que quelqu’un peut m’aider à la décortiquer ?
Merci,
Alexandre.
1 « J'aime »