Aracılığıyla paylaş


Xamarin.iOS'ta PhotoKit

PhotoKit, uygulamaların sistem görüntü kitaplığını sorgulamasına ve içeriğini görüntülemek ve değiştirmek için özel kullanıcı arabirimleri oluşturmasına olanak tanıyan bir çerçevedir. Resim ve video varlıklarının yanı sıra albümler ve klasörler gibi varlık koleksiyonlarını temsil eden bir dizi sınıf içerir.

İzinler

Uygulamanızın fotoğraf kitaplığına erişebilmesi için önce kullanıcıya bir izinler iletişim kutusu sunulur. Uygulamanızın fotoğraf kitaplığını nasıl kullandığını açıklamak için Info.plist dosyasında açıklayıcı metin sağlamanız gerekir, örneğin:

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

Model Nesneleri

PhotoKit bu varlıkları model nesneleri olarak adlandıran öğede temsil eder. Fotoğrafları ve videoları temsil eden model nesneleri türündedir PHAsset. , PHAsset varlığın medya türü ve oluşturulma tarihi gibi meta verileri içerir. Benzer şekilde, PHAssetCollection ve PHCollectionList sınıfları sırasıyla varlık koleksiyonları ve koleksiyon listeleri hakkında meta veriler içerir. Varlık koleksiyonları, belirli bir yıla ait tüm fotoğraflar ve videolar gibi varlık gruplarıdır. Benzer şekilde, koleksiyon listeleri de yıllara göre gruplandırılmış fotoğraflar ve videolar gibi varlık koleksiyonları gruplarıdır.

Model Verilerini Sorgulama

PhotoKit, çeşitli getirme yöntemleriyle model verilerini sorgulamayı kolaylaştırır. Örneğin, tüm görüntüleri almak için medya türünü geçirerek PHAssetMediaType.Image öğesini çağırabilirsinizPHAsset.Fetch.

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

Örnek PHFetchResult daha sonra görüntüleri temsil eden PHAsset tüm örnekleri içerir. Görüntüleri almak için öğesini çağırarak RequestImageForAssetgörüntü için istekte bulunmak üzere (veya önbelleğe alma sürümünüPHCachingImageManager) kullanırsınız PHImageManager . Örneğin, aşağıdaki kod koleksiyon görünümü hücresinde görüntülenecek bir içindeki PHFetchResult her varlık için bir görüntü alır:

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

Bu, aşağıda gösterildiği gibi bir görüntü kılavuzuna neden olur:

Görüntü kılavuzunu görüntüleyen çalışan uygulama

Değişiklikleri Fotoğraf Kitaplığına Kaydetme

Verileri sorgulama ve okuma bu şekilde işlenir. Ayrıca, değişiklikleri kitaplığa geri yazabilirsiniz. Birden çok ilgili uygulama sistem fotoğraf kitaplığıyla etkileşime geçinebildiğinden, kullanarak değişikliklerden PhotoLibraryObserverhaberdar olmak için bir gözlemci kaydedebilirsiniz. Ardından, değişiklikler geldiğinde uygulamanız buna göre güncelleştirilebilir. Örneğin, yukarıdaki koleksiyon görünümünü yeniden yüklemek için basit bir uygulama aşağıda verilmişti:

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

Değişiklikleri uygulamanızdan geri yazmak için bir değişiklik isteği oluşturursunuz. Model sınıflarının her birinin ilişkili bir değişiklik isteği sınıfı vardır. Örneğin, bir PHAssetöğesini değiştirmek için bir PHAssetChangeRequestoluşturursunuz. Fotoğraf kitaplığına geri yazılan ve yukarıdaki gibi gözlemcilere gönderilen değişiklikleri gerçekleştirme adımları şunlardır:

  1. Düzenleme işlemini gerçekleştirin.
  2. Filtrelenen görüntü verilerini bir PHContentEditingOutput örneğe kaydedin.
  3. Değişiklikleri düzenleme çıkışından yayımlamak için bir değişiklik isteğinde bulunabilirsiniz.

Aşağıda, Çekirdek Görüntü noir filtresi uygulayan bir görüntüde yapılan değişikliği geri yazan bir örnek verilmiştir:

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

Kullanıcı düğmeyi seçtiğinde filtre uygulanır:

Filtre uygulanmadan önce ve filtre uygulandıktan sonra fotoğrafı gösteren iki örnek

ve sayesinde PHPhotoLibraryChangeObserver, kullanıcı geri döndüğünde değişiklik koleksiyon görünümüne yansıtılır:

Değiştirilen fotoğrafı gösteren fotoğraf koleksiyonu görünümü