[SWIFT] Obtenez l'image sélectionnée en tant que données avec PHPickerViewController (et gérez Live Photo)

Nouvelle sélection de photos PHPickerViewController

L'accès à l'album a été révisé dans iOS14. Dans iOS14, veuillez remplacer l'application qui sélectionne les photos à l'aide du UIImagePicker conventionnel par PHPickerViewController.

Avantages de l'utilisation de PHPickerViewController

Si vous souhaitez simplement sélectionner des photos, vous n'avez pas besoin d'accorder l'accès aux photos à l'application. Cette boîte de dialogue de sélection d'autorisation ennuyeuse et au revoir au premier démarrage.

En effet, PHPickerViewController s'exécute dans un processus séparé (distinct de l'application hôte), l'accès aux photos est donc effectué par PHPicker. À partir de là, le mécanisme d'extension d'application est utilisé pour transmettre les informations de photo sélectionnées à l'application hôte, de sorte que l'accès à l'album n'est plus nécessaire.

PHPickerViewController prend également en charge la sélection de photos multiples.

Objectif

Supposons que vous souhaitiez sélectionner une photo, récupérer le fichier tel quel et l'envoyer au backend, ou l'enregistrer dans l'application. Puisque loadObject est une UIImage, il est destiné aux personnes qui ont des problèmes si les méta-informations d'origine sont perdues.

environnement

Xcode12 iOS14

Afficher la sélection de photos


import PhotosUI

private func showPhpicker() {
    //Si vous souhaitez l'obtenir en tant que PHAsset ultérieurement, spécifiez l'argument.
    var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
    //Nombre de sélections de photos simultanées. Illimité à 0
    config.selectionLimit = 1
    config.filter = PHPickerFilter.images

    let pickerViewController = PHPickerViewController(configuration: config)
    pickerViewController.delegate = self

    self.present(pickerViewController, animated: true, completion: nil)
}

Traitement de post-sélection

Est-ce que c'est comme ça? HEIC extrait le JPEG stocké à l'intérieur. Dans le cas d'une image, récupérez-la avec la méthode loadDataRepresentation.

J'ai proposé une méthode pour obtenir l'URL avec loadItem et la convertir en données, mais comme l'album n'est accessible que sur le processus de PHPickerViewContrller, peu importe combien l'URL est connue, l'album via l'URL de l'application Vous ne pouvez pas accéder aux ressources de.


///Méthode après sélection
/// - Parameters:
///   - picker: PHPickerVIewController
///   - results:Liste des résultats de la sélection
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    picker.dismiss(animated: true, completion: {
        // TODO:Traitement après la fermeture de PHPickerView
    })
    
    guard let provider = results.first?.itemProvider else { return }
    guard let typeIdentifer = provider.registeredTypeIdentifiers.first else { return }

    //Vérifiez si l'identifiant peut être déterminé
    if provider.hasItemConformingToTypeIdentifier(typeIdentifer) {
        //Disponible en Live Photo
        if provider.canLoadObject(ofClass: PHLivePhoto.self) {
            //LivePhoto est chargé avec LoadObject en spécifiant Class
            
            provider.loadObject(ofClass: PHLivePhoto.self) { (livePhotoObject, error) in
                do {
                    if let livePhoto:PHLivePhoto = livePhotoObject as? PHLivePhoto {
                        //Extraire une image fixe des propriétés de Live Photo(Format HEIC)
                        if let imageUrl = livePhoto.value(forKey: "imageURL") as? URL {
                        
                            //Générer des données à partir de l'URL (peut être obtenu car il fait référence aux données dans HEIC
                            let data:Data = try Data(contentsOf: imageUrl)
                            
                            
                            
                            //Générer un chemin et enregistrer l'image
                            //data.write(to: URL)

                        }
                    }
                } catch {
                    
                }
                
            }
            
        } else if provider.canLoadObject(ofClass: UIImage.self) {
            //Image générale
            //Dans le cas d'une image, utilisez loadObject pour l'obtenir avec UIImage ou loadData.
            //Lors de l'obtention de l'URL avec loadItem, l'obtention de l'IUImage ou des données à partir de l'URL nécessite une autorisation d'accès à l'album.
            provider.loadDataRepresentation(forTypeIdentifier: typeIdentifer) { (data, error) in
                if let imageData = data {
                    var ext = ""
                    switch typeIdentifer{
                    case "public.jpeg ":
                        ext = ".jpg "
                    case "public.png ":
                        ext = ".png "
                    default:
                        break
                    }
                    
                    //Enregistrer l'image
                    //data?.write(to: URL)
                        
                }
                
            }
        }

    }

}

L'exemple de projet est ci-dessous. https://github.com/onizine/PHPickerGetDataSample

Recommended Posts

Obtenez l'image sélectionnée en tant que données avec PHPickerViewController (et gérez Live Photo)
[IOS 14] Comment obtenir des données d'image de type Data directement à partir de PHPickerViewController?