.NET MAUIでiOSの写真ライブラリの一覧を取得する方法

.NET MAUI

皆さんはiOSアプリを作成中にiOSの写真ライブラリを取得したいと思ったことはありますか?
ですが、情報が少なすぎて挫折した人も多いと思います。なので、今回は私が書いたコードを共有したいと思います。

使い方

ImageSourceで返ってくるのでお好きなように弄ってください。

requestOptionsには以下のオプションがあります。

  1. Version: 使用する写真のバージョンを指定します。
    • Versionプロパティで指定可能。
  2. Resize Mode: 画像のリサイズ方法を指定します。
    • ResizeModeプロパティで指定可能。例: PHImageRequestOptionsResizeMode.Exact
  3. Delivery Mode: 写真の取得方法を指定します。
    • DeliveryModeプロパティで指定可能。例: PHImageRequestOptionsDeliveryMode.HighQualityFormat
  4. Synchronous: 同期的に取得するか非同期に取得するかを指定します。
    • Synchronousプロパティで指定可能。
  5. Network Access: ネットワークを使用して iCloud から写真を取得するかを指定します。
    • NetworkAccessAllowedプロパティで指定可能。
  6. Progress Handler: 写真の取得進捗をハンドリングするためのメソッドを指定します。
    • ProgressHandlerプロパティで指定可能。
  7. Delivery Queue: 取得した写真を配信するキューを指定します。
    • DeliveryQueueプロパティで指定可能。
  8. Resize Content Mode: 画像のリサイズモードを指定します。
    • ResizeContentModeプロパティで指定可能。
  9. Normalized Crop Rect: クロップ領域を指定します。
    • NormalizedCropRectプロパティで指定可能。
  10. Normalized User Info: ユーザー情報を指定します。
    • NormalizedUserInfoプロパティで指定可能。

コード

usingで以下のコードも追記してください。

#if IOS
using UIKit;
using CoreGraphics;
using Photos;
#endif
public ObservableCollection<ImageSource> GetPhotos()
        {
            ObservableCollection<ImageSource> photoCollection = new ObservableCollection<ImageSource>();

            PHFetchResult<PHAsset> assets = PHAsset.FetchAssets(new PHFetchOptions());

            foreach (PHAsset asset in assets)
            {
                ImageSource imageSource = GetImageSource(asset);
                photoCollection.Add(imageSource);
            }

            return photoCollection;
        }
private async Task<ImageSource> GetOriginalImageSource(PHAsset asset)
{
    var tcs = new TaskCompletionSource<ImageSource>();

    await Task.Run(() =>
    {
        var imageManager = PHImageManager.DefaultManager;
        var requestOptions = new PHImageRequestOptions
        {
            Synchronous = false,
            NetworkAccessAllowed = true // Allow network access for iCloud photos
        };

        imageManager.RequestImageForAsset(asset, PHImageManager.MaximumSize, PHImageContentMode.Default, requestOptions, (image, info) =>
        {
            if (image != null)
            {
                var uiImage = image as UIImage;

                // Convert UIImage to bytes
                var imageData = uiImage.AsJPEG().ToArray();

                Device.BeginInvokeOnMainThread(() =>
                {
                    tcs.SetResult(ImageSource.FromStream(() => new MemoryStream(imageData)));
                });
            }
            else
            {
                Console.WriteLine("Image is null.");
                Device.BeginInvokeOnMainThread(() =>
                {
                    tcs.SetResult(ImageSource.FromFile("placeholder.png"));
                });
            }
        });
    });

    return await tcs.Task;
}

コメント

タイトルとURLをコピーしました