皆さんはiOSアプリを作成中にiOSの写真ライブラリを取得したいと思ったことはありますか?
ですが、情報が少なすぎて挫折した人も多いと思います。なので、今回は私が書いたコードを共有したいと思います。
使い方
ImageSourceで返ってくるのでお好きなように弄ってください。
requestOptionsには以下のオプションがあります。
- Version: 使用する写真のバージョンを指定します。
Version
プロパティで指定可能。
- Resize Mode: 画像のリサイズ方法を指定します。
ResizeMode
プロパティで指定可能。例:PHImageRequestOptionsResizeMode.Exact
。
- Delivery Mode: 写真の取得方法を指定します。
DeliveryMode
プロパティで指定可能。例:PHImageRequestOptionsDeliveryMode.HighQualityFormat
。
- Synchronous: 同期的に取得するか非同期に取得するかを指定します。
Synchronous
プロパティで指定可能。
- Network Access: ネットワークを使用して iCloud から写真を取得するかを指定します。
NetworkAccessAllowed
プロパティで指定可能。
- Progress Handler: 写真の取得進捗をハンドリングするためのメソッドを指定します。
ProgressHandler
プロパティで指定可能。
- Delivery Queue: 取得した写真を配信するキューを指定します。
DeliveryQueue
プロパティで指定可能。
- Resize Content Mode: 画像のリサイズモードを指定します。
ResizeContentMode
プロパティで指定可能。
- Normalized Crop Rect: クロップ領域を指定します。
NormalizedCropRect
プロパティで指定可能。
- 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;
}
コメント