PhotoKit in Xamarin.iOS

Beispiel herunterladen Herunterladen eines Codebeispiels

PhotoKit ist ein Framework, mit dem Anwendungen die Systemimagebibliothek abfragen und benutzerdefinierte Benutzeroberflächen erstellen können, um den Inhalt anzuzeigen und zu ändern. Es enthält eine Reihe von Klassen, die Bild- und Videoressourcen sowie Sammlungen von Ressourcen wie Alben und Ordnern darstellen.

Berechtigungen

Bevor Ihre App auf die Fotobibliothek zugreifen kann, wird dem Benutzer ein Berechtigungsdialogfeld angezeigt. Sie müssen erklärenden Text in der Datei Info.plist angeben, um zu erläutern, wie Ihre App die Fotobibliothek verwendet, z. B.:

<key>NSPhotoLibraryUsageDescription</key>
<string>Applies filters to photos and updates the original image</string>

Modellobjekte

PhotoKit stellt diese Ressourcen in den so genannten Modellobjekten dar. Die Modellobjekte, die die Fotos und Videos selbst darstellen, sind vom Typ PHAsset. Ein PHAsset enthält Metadaten wie den Medientyp und das Erstellungsdatum des Medienobjekts. Entsprechend enthalten die PHAssetCollection Klassen und PHCollectionList Metadaten zu Ressourcensammlungen bzw. Auflistungslisten. Objektsammlungen sind Gruppen von Ressourcen, z. B. alle Fotos und Videos für ein bestimmtes Jahr. Ebenso sind Sammlungslisten Gruppen von Objektsammlungen, z. B. Fotos und Videos nach Jahr gruppiert.

Abfragen von Modelldaten

PhotoKit erleichtert das Abfragen von Modelldaten über eine Vielzahl von Abrufmethoden. Wenn Sie beispielsweise alle Bilder abrufen möchten, rufen PHAsset.FetchSie auf , und übergeben Sie den PHAssetMediaType.Image Medientyp.

PHFetchResult fetchResults = PHAsset.FetchAssets (PHAssetMediaType.Image, null);

Die PHFetchResult instance enthält dann alle Instanzen, die PHAsset Images darstellen. Um die Images selbst abzurufen, verwenden Sie die PHImageManager (oder die Zwischenspeicherungsversion), um eine Anforderung für das Image zu stellen, PHCachingImageManagerindem Sie aufrufen RequestImageForAsset. Der folgende Code ruft beispielsweise ein Bild für jedes Objekt in einem PHFetchResult ab, das in einer Sammlungsansichtszelle angezeigt wird:

public override UICollectionViewCell GetCell (UICollectionView collectionView, NSIndexPath indexPath)
{
    var imageCell = (ImageCell)collectionView.DequeueReusableCell (cellId, indexPath);
    imageMgr.RequestImageForAsset (
        (PHAsset)fetchResults [(uint)indexPath.Item],
        thumbnailSize,
        PHImageContentMode.AspectFill, new PHImageRequestOptions (),
        (img, info) => {
            imageCell.ImageView.Image = img;
        }
    );
    return imageCell;
}

Dies führt zu einem Raster von Bildern, wie unten gezeigt:

Die ausgeführte App, die ein Raster von Bildern anzeigt

Speichern von Änderungen in der Fotobibliothek

So wird das Abfragen und Lesen von Daten behandelt. Sie können Änderungen auch zurück in die Bibliothek schreiben. Da mehrere interessierte Anwendungen mit der Systemfotobibliothek interagieren können, können Sie einen Beobachter registrieren, um über Änderungen informiert PhotoLibraryObserverzu werden. Wenn Dann Änderungen eintreffen, kann Ihre Anwendung entsprechend aktualisiert werden. Hier sehen Sie beispielsweise eine einfache Implementierung, um die Sammlungsansicht oben neu zu laden:

class PhotoLibraryObserver : PHPhotoLibraryChangeObserver
{
    readonly PhotosViewController controller;
    public PhotoLibraryObserver (PhotosViewController controller)

    {
        this.controller = controller;
    }

    public override void PhotoLibraryDidChange (PHChange changeInstance)
    {
        DispatchQueue.MainQueue.DispatchAsync (() => {
            var changes = changeInstance.GetFetchResultChangeDetails (controller.fetchResults);
            controller.fetchResults = changes.FetchResultAfterChanges;
            controller.CollectionView.ReloadData ();
        });
    }
}

Um Änderungen tatsächlich aus Ihrer Anwendung zurückzuschreiben, erstellen Sie eine Änderungsanforderung. Jede Modellklasse verfügt über eine zugeordnete Änderungsanforderungsklasse. Um z. B. einen PHAssetzu ändern, erstellen Sie ein PHAssetChangeRequest. Die Schritte zum Ausführen von Änderungen, die zurück in die Fotobibliothek geschrieben und wie oben an Beobachter gesendet werden, sind:

  1. Führen Sie den Bearbeitungsvorgang aus.
  2. Speichern Sie die gefilterten Bilddaten in einem PHContentEditingOutput instance.
  3. Stellen Sie eine Änderungsanforderung, um die Änderungen aus der Bearbeitungsausgabe zu veröffentlichen.

Im Folgenden sehen Sie ein Beispiel, in dem eine Änderung auf ein Bild zurückgeschrieben wird, das einen Core Image Noir-Filter anwendet:

void ApplyNoirFilter (object sender, EventArgs e)
{
    Asset.RequestContentEditingInput (new PHContentEditingInputRequestOptions (), (input, options) => {

        // perform the editing operation, which applies a noir filter in this case
        var image = CIImage.FromUrl (input.FullSizeImageUrl);
        image = image.CreateWithOrientation((CIImageOrientation)input.FullSizeImageOrientation);
        var noir = new CIPhotoEffectNoir {
            Image = image
        };
        var ciContext = CIContext.FromOptions (null);
        var output = noir.OutputImage;
        var uiImage = UIImage.FromImage (ciContext.CreateCGImage (output, output.Extent));
        imageView.Image = uiImage;
        //
        // save the filtered image data to a PHContentEditingOutput instance
        var editingOutput = new PHContentEditingOutput(input);
        var adjustmentData = new PHAdjustmentData();
        var data = uiImage.AsJPEG();
        NSError error;
        data.Save(editingOutput.RenderedContentUrl, false, out error);
        editingOutput.AdjustmentData = adjustmentData;
        //
        // make a change request to publish the changes form the editing output
        PHPhotoLibrary.GetSharedPhotoLibrary.PerformChanges (() => {
            PHAssetChangeRequest request = PHAssetChangeRequest.ChangeRequest(Asset);
            request.ContentEditingOutput = editingOutput;
        },
        (ok, err) => Console.WriteLine ("photo updated successfully: {0}", ok));
    });
}

Wenn der Benutzer die Schaltfläche auswählt, wird der Filter angewendet:

Zwei Beispiele, die das Foto vor und nach dem Anwenden des Filters zeigen

Und dank wird die PHPhotoLibraryChangeObserverÄnderung in der Sammlungsansicht widerspiegelt, wenn der Benutzer zurück navigiert:

Fotosammlungsansicht mit dem geänderten Foto