PhotoKit v Xamarin. iOSPhotoKit in Xamarin.iOS

Stažení ukázky stažení ukázky kóduDownload Sample Download a code sample

PhotoKit je rozhraní, které umožňuje aplikacím dotazovat se na knihovnu systémových imagí a vytvářet vlastní uživatelská rozhraní pro zobrazení a úpravu jejího obsahu.PhotoKit is a framework that allows applications to query the system image library and create custom user interfaces to view and modify its contents. Obsahuje několik tříd, které reprezentují image a video assety, a také kolekce prostředků, jako jsou například alba a složky.It includes a number of classes that represent image and video assets, as well as collections of assets such as albums and folders.

OprávněníPermissions

Předtím, než aplikace bude mít přístup k knihovně fotek, se uživateli zobrazí dialogové okno s oprávněním.Before your app can access the photo library, the user will be presented with a permissions dialog. V souboru info. plist je nutné zadat vysvětlující text, který vysvětluje, jak vaše aplikace používá knihovnu fotografií, například:You must provide explanatory text in the Info.plist file to explain how your app uses the photo library, for example:

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

Objekty modeluModel Objects

PhotoKit představuje tyto prostředky při volání objektů modelu.PhotoKit represents these assets in what it calls model objects. Objekty modelu reprezentující fotografie a videa jsou typu PHAsset .The model objects that represent the photos and videos themselves are of type PHAsset. PHAssetObsahuje metadata, jako je například typ média prostředku a datum jejího vytvoření.A PHAsset contains metadata such as the asset’s media type and its creation date. Podobně PHAssetCollection PHCollectionList třídy a obsahují metadata o kolekcích assetů a seznamech kolekcí.Similarly, the PHAssetCollection and PHCollectionList classes contain metadata about asset collections and collection lists respectively. Kolekce prostředků jsou skupiny prostředků, jako jsou všechny fotky a videa pro daný rok.Asset collections are groups of assets, such as all the photos and videos for a given year. Seznamy kolekcí jsou podobně skupinami kolekcí assetů, jako jsou fotografie a videa seskupené podle roku.Likewise, collection lists are groups of asset collections, such as photos and videos grouped by year.

Dotazování na data modeluQuerying Model Data

PhotoKit usnadňuje dotazování na data modelu prostřednictvím celé řady metod načtení.PhotoKit makes it easy to query model data through a variety of fetch methods. Například pro načtení všech imagí by volání bylo voláno s PHAsset.Fetch předáváním PHAssetMediaType.Image typu média.For example, to retrieve all images, you would call PHAsset.Fetch, passing the PHAssetMediaType.Image media type.

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

PHFetchResultInstance by pak obsahovala všechny PHAsset instance reprezentující obrázky.The PHFetchResult instance would then contain all the PHAsset instances representing images. Chcete-li získat image sami, použijte PHImageManager (nebo mezipaměť PHCachingImageManager ) a vytvořte požadavek na bitovou kopii voláním RequestImageForAsset .To get the images themselves, you use the PHImageManager (or the caching version, PHCachingImageManager) to make a request for the image by calling RequestImageForAsset. Například následující kód načte obrázek pro každý Asset v a PHFetchResult , který se zobrazí v buňce zobrazení kolekce:For example, the following code retrieves an image for each asset in a PHFetchResult to display in a collection view cell:

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;
}

Výsledkem je mřížka obrázků, jak je znázorněno níže:This results in a grid of images as shown below:

Běžící aplikace zobrazující mřížku imagí

Uložení změn do knihovny fotografiíSaving Changes to the Photo Library

To je postup, jak zpracovávat dotazy a číst data.That’s how to handle querying and reading data. Změny můžete také zapsat zpět do knihovny.You can also write changes back to the library. Vzhledem k tomu, že více zúčastněných aplikací dokáže pracovat s knihovnou fotografií systému, můžete zaregistrovat pozorovatele, aby se zobrazilo upozornění na změny pomocí PhotoLibraryObserver .Since multiple interested applications are able to interact with the system photo library, you can register an observer to be notified of changes using a PhotoLibraryObserver. Až se změny projeví, může se aplikace aktualizovat odpovídajícím způsobem.Then, when changes come in, your application can update accordingly. Tady je například Jednoduchá implementace pro opětovné načtení zobrazení kolekce výše:For example, here’s a simple implementation to reload the collection view above:

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 ();
        });
    }
}

Pokud chcete ve skutečnosti zapisovat změny zpátky z vaší aplikace, vytvořte žádost o změnu.To actually write changes back from your application, you create a change request. Každá z tříd modelu má přidruženou třídu žádosti o změnu.Each of the model classes has an associated change request class. Například pro změnu PHAsset , vytvoříte PHAssetChangeRequest .For example, to change a PHAsset, you create a PHAssetChangeRequest. Kroky pro provedení změn, které jsou zapsány zpět do knihovny fotek a odesílány do pozorovatelů, jako je ten výše:The steps to perform changes that are written back to the photo library and sent to observers like the one above are:

  1. Proveďte operaci úprav.Perform the editing operation.
  2. Uložte filtrovaná data obrázku do PHContentEditingOutput instance.Save the filtered image data to a PHContentEditingOutput instance.
  3. Vytvořte žádost o změnu, která publikuje změny z výstupu pro úpravy.Make a change request to publish the changes from the editing output.

Tady je příklad, který zapisuje zpátky změnu obrázku, který použije základní filtr Noir Image:Here’s an example that writes back a change to an image that applies a Core Image noir filter:

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));
    });
}

Když uživatel vybere tlačítko, použije se filtr:When the user selects the button, the filter is applied:

Dva příklady, zobrazení fotografie před a po použití filtru

A děkuji za PHPhotoLibraryChangeObserver , tato změna se projeví v zobrazení kolekce, když uživatel přejde zpět:And thanks to the PHPhotoLibraryChangeObserver, the change is reflected in the collection view when the user navigates back:

Zobrazení kolekce fotek zobrazující upravenou fotografii