从Xamarin/C#中的URL加载的UIImage

本文关键字:加载 UIImage URL 中的 Xamarin | 更新日期: 2023-09-27 18:24:48

这篇博文已经4年没有回答这个问题了。

有没有一种标准的方法可以用URL中的图像创建UIImage?类似于:

UIImage image = UIImage.FromFile("http://foo.com/bar.jpg");

我觉得我可能错过了一些非常简单的东西。

从Xamarin/C#中的URL加载的UIImage

不是一行,但只有很少的几行,你就可以自己滚动。例如

static UIImage FromUrl (string uri)
{
    using (var url = new NSUrl (uri))
    using (var data = NSData.FromUrl (url))
        return UIImage.LoadFromData (data);
}

这些调用(包括来自UIImage的调用)是线程安全的。

有了新的等待/异步支持,您可以做到:

public async Task<UIImage> LoadImage (string imageUrl)
        {
            var httpClient = new HttpClient();
            Task<byte[]> contentsTask = httpClient.GetByteArrayAsync (imageUrl);
            // await! control returns to the caller and the task continues to run on another thread
            var contents = await contentsTask;
            // load from bytes
            return UIImage.LoadFromData (NSData.FromArray (contents));
        }

你用来称呼这个

someYourUIImageObjectOnUI.Image = await this.LoadImage ("some image url");

您需要确保以异步方式加载图像,这样就不会阻塞UI线程。Dialog包含一个可以使用的ImageLoader(参见第5.3节)类。

UrlImageStore还有一些变体可以帮助异步加载图像。

最后,如果你想手动操作,可以使用Xamarin配方。

我尝试了上面的方法,这看起来是个好主意,但我得到了:无法隐式转换类型System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>' to Monotouch.UIKet.UIImage'

[找到了解决方案]问题是因为
obj.Image=等待。LoadImage(imageUrl)还必须在标记为async的方法中。那就行了!

感谢

下面的代码应该可以工作,

public static async Task<UIImage> LoadImage(string imageUrl)
{
            var httpClient = new HttpClient();
            var contents = await httpClient.GetByteArrayAsync(imageUrl);
            return UIImage.LoadFromData(NSData.FromArray(contents));
}