[SWIFT] Holen Sie sich das ausgewählte Bild als Daten mit PHPickerViewController (und verarbeiten Sie Live Photo)

Neue Fotoauswahl PHPickerViewController

Der Zugriff auf das Album wurde in iOS14 überarbeitet. Ersetzen Sie in iOS14 die Anwendung, die Fotos mit dem herkömmlichen UIImagePicker auswählt, durch PHPickerViewController.

Vorteile der Verwendung von PHPickerViewController

Wenn Sie nur Fotos auswählen möchten, müssen Sie der App keinen Fotozugriff gewähren. Dieser nervige Berechtigungsauswahldialog und auf Wiedersehen beim ersten Start.

Dies liegt daran, dass PHPickerViewController in einem separaten Prozess (getrennt von der Host-App) ausgeführt wird, sodass der Fotozugriff von PHPicker erfolgt. Von dort aus wird der App-Erweiterungsmechanismus verwendet, um die ausgewählten Fotoinformationen an die Host-App zu übergeben, sodass kein Zugriff mehr auf das Album erforderlich ist.

PHPickerViewController unterstützt auch die Auswahl mehrerer Fotos.

Zweck

Stellen Sie sich einen Fall vor, in dem Sie ein Foto auswählen, die Datei unverändert abrufen und an das Backend senden oder in der App speichern möchten. Da loadObject ein UIImage ist, ist es für Personen gedacht, die in Schwierigkeiten sind, wenn die ursprünglichen Metainformationen verloren gehen.

Umgebung

Xcode12 iOS14

Fotoauswahl anzeigen


import PhotosUI

private func showPhpicker() {
    //Wenn Sie es später als PHAsset erhalten möchten, geben Sie das Argument an.
    var config = PHPickerConfiguration(photoLibrary: PHPhotoLibrary.shared())
    //Anzahl gleichzeitiger Fotoauswahl. Unbegrenzt bei 0
    config.selectionLimit = 1
    config.filter = PHPickerFilter.images

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

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

Nachauswahlverarbeitung

Ist es wie folgt? HEIC extrahiert das darin gespeicherte JPEG. Im Fall eines Bildes rufen Sie es mit der loadDataRepresentation-Methode ab.

Ich habe mir eine Methode ausgedacht, um die URL mit loadItem abzurufen und in Daten zu konvertieren. Da jedoch nur mit PHPickerViewContrller auf das Album zugegriffen werden kann, wird das Album unabhängig von der bekannten URL über die URL aus der Anwendung abgerufen Sie können nicht auf die Ressourcen von zugreifen.


///Methode nach Auswahl
/// - Parameters:
///   - picker: PHPickerVIewController
///   - results:Liste der Auswahlergebnisse
func picker(_ picker: PHPickerViewController, didFinishPicking results: [PHPickerResult]) {
    picker.dismiss(animated: true, completion: {
        // TODO:Die Verarbeitung nach dem Schließen von PHPickerView
    })
    
    guard let provider = results.first?.itemProvider else { return }
    guard let typeIdentifer = provider.registeredTypeIdentifiers.first else { return }

    //Überprüfen Sie, ob die Kennung ermittelt werden kann
    if provider.hasItemConformingToTypeIdentifier(typeIdentifer) {
        //Verfügbar als Live-Foto
        if provider.canLoadObject(ofClass: PHLivePhoto.self) {
            //LivePhoto wird mit LoadObject geladen, indem Class angegeben wird
            
            provider.loadObject(ofClass: PHLivePhoto.self) { (livePhotoObject, error) in
                do {
                    if let livePhoto:PHLivePhoto = livePhotoObject as? PHLivePhoto {
                        //Extrahieren Sie ein Standbild aus den Eigenschaften von Live Photo(HEIC-Format)
                        if let imageUrl = livePhoto.value(forKey: "imageURL") as? URL {
                        
                            //Daten aus URL generieren (kann abgerufen werden, da sie sich auf die Daten in HEIC beziehen
                            let data:Data = try Data(contentsOf: imageUrl)
                            
                            
                            
                            //Generieren Sie einen Pfad und speichern Sie das Bild
                            //data.write(to: URL)

                        }
                    }
                } catch {
                    
                }
                
            }
            
        } else if provider.canLoadObject(ofClass: UIImage.self) {
            //Allgemeines Bild
            //Verwenden Sie im Fall eines Bildes loadObject, um es mit UIImage oder loadData abzurufen.
            //Wenn Sie die URL mit loadItem abrufen, benötigen Sie zum Abrufen von UIImage oder Daten von der URL eine Zugriffsberechtigung für das 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
                    }
                    
                    //Bild speichern
                    //data?.write(to: URL)
                        
                }
                
            }
        }

    }

}

Das Beispielprojekt ist unten. https://github.com/onizine/PHPickerGetDataSample

Recommended Posts

Holen Sie sich das ausgewählte Bild als Daten mit PHPickerViewController (und verarbeiten Sie Live Photo)
[IOS 14] Wie erhalte ich Bilddaten vom Datentyp direkt von PHPickerViewController?