Bagikan melalui


PhotoKit di Xamarin.iOS

PhotoKit adalah kerangka kerja yang memungkinkan aplikasi untuk mengkueri pustaka gambar sistem dan membuat antarmuka pengguna kustom untuk melihat dan memodifikasi kontennya. Ini termasuk sejumlah kelas yang mewakili aset gambar dan video, serta koleksi aset seperti album dan folder.

Izin

Sebelum aplikasi Anda dapat mengakses pustaka foto, pengguna akan disajikan dengan dialog izin. Anda harus memberikan teks penjelasan dalam file Info.plist untuk menjelaskan bagaimana aplikasi Anda menggunakan pustaka foto, misalnya:

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

Objek Model

PhotoKit mewakili aset ini dalam apa yang disebut objek model. Objek model yang mewakili foto dan video itu sendiri berjenis PHAsset. berisi PHAsset metadata seperti jenis media aset dan tanggal pembuatannya. Demikian pula, PHAssetCollection kelas dan PHCollectionList berisi metadata tentang koleksi aset dan daftar koleksi masing-masing. Koleksi aset adalah grup aset, seperti semua foto dan video untuk tahun tertentu. Demikian juga, daftar koleksi adalah grup koleksi aset, seperti foto dan video yang dikelompokkan menurut tahun.

Mengkueri Data Model

PhotoKit memudahkan kueri data model melalui berbagai metode pengambilan. Misalnya, untuk mengambil semua gambar, Anda akan memanggil PHAsset.Fetch, melewati PHAssetMediaType.Image jenis media.

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

PHFetchResult Instans kemudian akan berisi semua PHAsset instans yang mewakili gambar. Untuk mendapatkan gambar itu sendiri, Anda menggunakan PHImageManager (atau versi penembolokan, PHCachingImageManager) untuk membuat permintaan gambar dengan memanggil RequestImageForAsset. Misalnya, kode berikut mengambil gambar untuk setiap aset dalam PHFetchResult untuk ditampilkan dalam sel tampilan koleksi:

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

Ini menghasilkan kisi gambar seperti yang ditunjukkan di bawah ini:

Aplikasi yang sedang berjalan menampilkan kisi gambar

Menyimpan Perubahan ke Pustaka Foto

Itulah cara menangani kueri dan membaca data. Anda juga dapat menulis perubahan kembali ke pustaka. Karena beberapa aplikasi yang tertarik dapat berinteraksi dengan pustaka foto sistem, Anda dapat mendaftarkan pengamat untuk diberi tahu tentang perubahan menggunakan PhotoLibraryObserver. Kemudian, ketika perubahan masuk, aplikasi Anda dapat memperbarui dengan sesuai. Misalnya, berikut adalah implementasi sederhana untuk memuat ulang tampilan koleksi di atas:

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

Untuk benar-benar menulis perubahan kembali dari aplikasi Anda, Anda membuat permintaan perubahan. Setiap kelas model memiliki kelas permintaan perubahan terkait. Misalnya, untuk mengubah PHAsset, Anda membuat PHAssetChangeRequest. Langkah-langkah untuk melakukan perubahan yang ditulis kembali ke perpustakaan foto dan dikirim ke pengamat seperti yang di atas adalah:

  1. Lakukan operasi pengeditan.
  2. Simpan data gambar yang difilter ke PHContentEditingOutput instans.
  3. Buat permintaan perubahan untuk menerbitkan perubahan dari output pengeditan.

Berikut adalah contoh yang menulis kembali perubahan pada gambar yang menerapkan filter noir Gambar Inti:

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

Saat pengguna memilih tombol , filter diterapkan:

Dua contoh, memperlihatkan foto sebelum dan sesudah filter diterapkan

Dan berkat PHPhotoLibraryChangeObserver, perubahan tercermin dalam tampilan koleksi saat pengguna menavigasi kembali:

Tampilan koleksi foto memperlihatkan foto yang dimodifikasi