【问题标题】:How to select multiple picture from gallery using GMImagePicker in xamarin IOS?如何在 xamarin IOS 中使用 GMImagePicker 从图库中选择多张图片?
【发布时间】:2019-06-08 06:42:20
【问题描述】:

我正在关注此blog 从图库中选择多张图片。对于 IOS,我使用GMImagePicker 从图库中选择多张图片。(在博客中建议使用 elcimagepicker,但现在 Nuget 商店中不可用)

我浏览了GMImagePickerusage part,但没有找到如何将所选图像添加到List 并将该值传递给MessagingCenter(就像android 实现一样)。在那个使用部分只讲述了选择器设置。任何人请给我任何执行此功能的示例代码?

Lucas Zhang - MSFT,我试过你的代码,但有一个问题。在这里,您只通过messagecenter 传递一个文件路径,那么我应该使用列表来发送多个文件路径吗?

我将图片路径作为来自 android 的 string List 传递。请看下面添加的android部分代码。我应该在 IOS 中这样做吗?

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        if (resultCode == Result.Ok)
        {
            List<string> images = new List<string>();

            if (data != null)
            {
                ClipData clipData = data.ClipData;
                if (clipData != null)
                {
                    for (int i = 0; i < clipData.ItemCount; i++)
                    {
                        ClipData.Item item = clipData.GetItemAt(i);
                        Android.Net.Uri uri = item.Uri;
                        var path = GetRealPathFromURI(uri);

                        if (path != null)
                        {
                            //Rotate Image
                            var imageRotated = ImageHelpers.RotateImage(path);
                            var newPath = ImageHelpers.SaveFile("TmpPictures", imageRotated, System.DateTime.Now.ToString("yyyyMMddHHmmssfff"));
                            images.Add(newPath);
                        }
                    }
                }
                else
                {
                    Android.Net.Uri uri = data.Data;
                    var path = GetRealPathFromURI(uri);

                    if (path != null)
                    {
                        //Rotate Image
                        var imageRotated = ImageHelpers.RotateImage(path);
                        var newPath = ImageHelpers.SaveFile("TmpPictures", imageRotated, System.DateTime.Now.ToString("yyyyMMddHHmmssfff"));
                        images.Add(newPath);
                    }
                }

                MessagingCenter.Send<App, List<string>>((App)Xamarin.Forms.Application.Current, "ImagesSelected", images);
            }
        }
    }

另外,我收到一个错误,截图添加如下:

【问题讨论】:

  • 将您的表单更新到 3.x。
  • @LucasZhang-MSFT 我会这样做并更新你
  • 你解决了吗?
  • @LucasZhang-MSFT 我在 Mac 上远程工作,现在我没有 mac 访问权限。当我拿到 Mac 时,我会进行更改并更新您。
  • @LucasZhang-MSFT 我在 android 部分有一个小问题。图片扩展名(.jpg 或 .png)未与 android 部分的路径一起保存。要将图像上传到服务器,我需要带有扩展名的完整图像名称。那么如何使用扩展名保存所选图像的完整名称?您能提出任何解决方案吗?

标签: image xamarin.forms xamarin.ios


【解决方案1】:

GMImagePicker 将返回一个包含PHAsset 的列表。因此您可以先获取图像的文件路径,然后使用MessagingCenterDependencyService 将它们传递给表单。参考以下代码.

在表单中,创建一个界面

using System;

namespace app1
{
  public interface ISelectMultiImage
  {
    void SelectedImage();
  }
}

在 iOS 项目中

using System;
using Xamarin.Forms;
using UIKit;
using GMImagePicker;
using Photos;
using Foundation;

[assembly:Dependency(typeof(SelectMultiImageImplementation))]
namespace xxx.iOS
{
  public class SelectMultiImageImplementation:ISelectMultiImage
  {
    public SelectMultiImageImplementation()
    {
    }


    string Save(UIImage image, string name)
    {
        var documentsDirectory = Environment.GetFolderPath
                              (Environment.SpecialFolder.Personal);
        string jpgFilename = System.IO.Path.Combine(documentsDirectory, name); // hardcoded filename, overwritten each time
        NSData imgData = image.AsJPEG();
        if (imgData.Save(jpgFilename, false, out NSError err))
        {
            return jpgFilename;
        }
        else
        {
            Console.WriteLine("NOT saved as " + jpgFilename + " because" + err.LocalizedDescription);
            return null;
        }
    }

    public void SelectedImage()
    {

        var picker = new GMImagePickerController();
        picker.FinishedPickingAssets += (s, args) => {


            PHAsset[] assets = args.Assets;



            foreach (PHAsset asset in assets)
            {
                PHImageManager.DefaultManager.RequestImageData(asset, null, (NSData data, NSString dataUti, UIImageOrientation orientation, NSDictionary info) =>
                {
                    NSUrl url = NSUrl.FromString(info.ValueForKey(new NSString("PHImageFileURLKey")).ToString());

                    string[] strs = url.Split("/");


                    UIImage image = UIImage.LoadFromData(data);

                    string file = Save(UIImage.LoadFromData(data), strs[strs.Length - 1]);


                    MessagingCenter.Send<Object, string>(this, "ImagesSelected", file);

                }
                );

            }

        };
       UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(picker, true,null);

    }
  }
}

在您的内容页面中

...
List<string> selectedImages;
...

public MyPage()
{
   selectedImages = new List<string>();
   InitializeComponent();

   MessagingCenter.Subscribe<Object,string>(this, "ImagesSelected",(object arg1,string arg2) =>
        {
            string source = arg2;

            selectedImages.Add(source);

        });

 } 

如果要选择图片,调用方法

 DependencyService.Get<ISelectMultiImage>().SelectedImage();

【讨论】:

  • 嗨,我用几个问题编辑了这个问题,你能看看...
  • 当前上下文中不存在名称'urlString'
  • string[] strs = urlString.Split("/");
  • 每个循环里面,你能看一下吗?
  • 对不起,是url。
猜你喜欢
  • 1970-01-01
  • 2013-11-04
  • 2018-10-27
  • 1970-01-01
  • 2016-07-13
  • 2018-10-04
相关资源
最近更新 更多