【问题标题】:Save UIImage as jpg File in Photo Library Directory in Xamarin.iOS在 Xamarin.iOS 的照片库目录中将 UIImage 保存为 jpg 文件
【发布时间】:2017-08-17 09:36:24
【问题描述】:

据我所知,这是将其保存在照片库中的简单方法。但它可以用自定义文件名保存。

var someImage = UIImage.FromFile("someImage.jpg");
someImage.SaveToPhotosAlbum((image, error) => {
    var o = image as UIImage;
    Console.WriteLine("error:" + error);
})

但我想用 filename.jpg 将它保存在照片库中。

我尝试了很多代码,但没有任何帮助。

代码 1:

var imageName = "/" + dicomId.ToString() + ".jpg";

var documentsDirectory = Environment.GetFolderPath
                    (Environment.SpecialFolder.Personal);

string jpgFilename = System.IO.Path.Combine(documentsDirectory, imageName); // hardcoded filename, overwritten each time
NSData imgData = dicomImage.AsJPEG();
NSError err = null;
if (imgData.Save(jpgFilename, false, out err))
{
    Console.WriteLine("saved as " + jpgFilename);
}
else
{
    Console.WriteLine("NOT saved as " + jpgFilename + " because" + err.LocalizedDescription);
}

此代码部分进入 if 条件,但无法保存图像。

代码 2:

如果使用这部分代码

var documentsDirectoryPath = NSSearchPath.GetDirectories(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomain.User, true)[0];

它给你没有保存图像的权限。

我在 google 和 SO 上尝试了很多东西,但对我没有任何帮助。

编辑:

info.plist

任何帮助将不胜感激。

【问题讨论】:

  • 您是否在 plist 文件中添加了适当的权限?特别是隐私 - 照片库使用说明
  • @saketkumar 我已经添加了权限..
  • 在你的标题中你说你想保存 png 文件,有问题你说,你想用 jpg 保存它。您希望以哪种格式保存?
  • @saketkumar 我更新了我的问题..
  • Shared Photo Library(照片框架)中的文件名不可管理。它们是 PHAsset 中的只读工件,可能会因 iCloud 同步等原因而发生变化...如果您需要一种方法来跟踪共享库中的 您的 应用程序图像,请将自定义元数据分配给图像。

标签: file xamarin xamarin.ios uiimage save


【解决方案1】:

UIImage.SaveToPhotosAlbum()怎么样?

用法类似于:

image.SaveToPhotosAlbum((uiImage, nsError) =>
{
    if (nsError != null)
        // do something about the error..
    else
        // image should be saved
});

在尝试保存之前,请确保您已请求权限。

PHPhotoLibrary.RequestAuthorization(status =>
{
    switch (status)
    {
        case PHAuthorizationStatus.Restricted:
        case PHAuthorizationStatus.Denied:
            // nope you don't have permission
            break;
        case PHAuthorizationStatus.Authorized:
            // yep it is ok to save
            break;
    }
});

编辑:如果你想要更多的控制,你需要使用PHPhotosLibrary,这是一个糟糕的 API...

var library = PHPhotoLibrary.SharedPhotoLibrary;

var albumName = "MyPhotos";

var fetchOptions = new PHFetchOptions();
fetchOptions.Predicate = NSPredicate.FromFormat($"title = {albumName}");
var assetsCollections = PHAssetCollection.FetchAssetCollections(
    PHAssetCollectionType.Album, PHAssetCollectionSubtype.Any, fetchOptions);

var collection = assetsCollections.firstObject as PHAssetCollection;

library.PerformChanges(() => {
    var options = new PHAssetResourceCreationOptions();
    options.OriginalFilename = "filename.jpg";
    var createRequest = PHAssetCreationRequest.CreationRequestForAsset();
    createRequest.AddResource(PHAssetResourceType.FullSizePhoto, image.AsJPEG(1), options);

    // if you want to save to specific album... otherwise just remove these three lines
    var placeholder = createRequest.PlaceholderForCreatedAsset;
    var albumChangeRequest = PHAssetCollectionChangeRequest.ChangeRequest(collection);
    albumChangeRequest.AddAssets(new PHObject[] { placeholder });
}, 
(ok, error) => {
    if (error != null)
    {
        // someone set up us the bomb
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多