Xamarin. iOS içindeki PhotoKit

Örnek indir Bir kod örneği indirin

PhotoKit, uygulamaların, içeriğini görüntülemek ve değiştirmek için sistem görüntü kitaplığını sorgulamasını ve özel kullanıcı arabirimleri oluşturmasını sağlayan bir çerçevedir. Görüntü 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, kullanıcıya bir izinler iletişim kutusu sunulacaktır. Uygulamanızın fotoğraf kitaplığını nasıl kullandığını açıklamak için Info. plist dosyasına 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, model nesnelerini çağırdığı bu varlıkları 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, yıla göre gruplanmış fotoğraflar ve videolar gibi varlık koleksiyonları gruplarıdır.

Model verileri sorgulanıyor

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

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

PHFetchResultÖrnek daha sonra PHAsset görüntüleri temsil eden tüm örnekleri içerir. Görüntülerin kendilerini almak için PHImageManager (veya önbelleğe alma sürümü) kullanarak, PHCachingImageManager çağırarak görüntüye yönelik bir istek yaparsınız RequestImageForAsset . Örneğin, aşağıdaki kod bir PHFetchResult koleksiyon görünümü hücresinde görüntülemek için içindeki her bir 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

Fotoğraf kitaplığına değişiklikler kaydediliyor

Verileri sorgulamayı ve okumayı işleme. Değişiklikleri kitaplığa geri de yazabilirsiniz. Birden çok ilgi eden uygulama sistem fotoğraf kitaplığıyla etkileşime girebileceği için, bir gözlemci kullanarak değişiklikler hakkında bildirim alabilirsiniz PhotoLibraryObserver . Ardından, değişiklikler geldiğinde uygulamanız buna uygun şekilde güncelleştirebilir. Örneğin, yukarıdaki koleksiyon görünümünü yeniden yüklemek için basit bir uygulama aşağıda verilmiştir:

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şturun. Her model sınıfının bir ilişkili değişiklik isteği sınıfı vardır. Örneğin, bir değiştirmek için PHAsset , oluşturun PHAssetChangeRequest . Fotoğraf kitaplığına geri yazılan ve yukarıdaki gibi gözlemcilerin 'a gönderilen değişiklikleri gerçekleştirme adımları şunlardır:

  1. Düzenle işlemini gerçekleştirin.
  2. Filtrelenmiş görüntü verilerini bir PHContentEditingOutput örneğe kaydedin.
  3. Değişiklikleri Düzenle çıktısından yayımlamak için bir değişiklik isteği oluşturun.

Bir temel görüntü NOIR filtresi uygulayan bir görüntüye değişiklik geri yazan bir örnek aşağıda 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 uygulandıktan sonra ve sonra fotoğrafın gösterildiği iki örnek

Ve için teşekkürler PHPhotoLibraryChangeObserver , Kullanıcı geri gittiğinde değişiklik koleksiyon görünümünde yansıtılır:

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