在Xamarin / C#中从URL加载UIImage

27

自从这个问题这篇博客文章回答以来,已经过去了4年。

是否有标准方法可以通过URL创建UIImage?例如:

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

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

5个回答

58

虽不是一行代码,但只需极少的几行代码,你就可以自己编写。例如:

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

包括来自 UIImage 的调用,都是线程安全的。


如果提供的URL无效(不符合RFC 2396标准),则NSUrl会抛出异常(在ObjC中返回nil)。请参阅苹果的文档@https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/Reference/Reference.html#//apple_ref/occ/instm/NSURL/initWithString:。 - poupou

28

使用新的 await/async 支持,可以执行以下操作:

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");

5
byte[] contents = await httpClient.GetByteArrayAsync(imageUrl);意思是:从指定的网址imageUrl获取字节数组内容,使用httpClient.GetAsync方法进行异步操作,并将结果存储在contents变量中。 - user567677

5
你需要确保异步加载图片,以避免阻塞UI线程。MonoTouch.Dialog包括一个ImageLoader(请参见第5.3节)类可供使用。
还有一些UrlImageStore的变体可帮助异步加载图像。
最后,如果您想手动完成,可以使用Xamarin Recipe

1

我尝试了上面的方法,看起来是个好主意,但是我遇到了以下问题:

无法隐式转换类型 System.Threading.Tasks.Task<MonoTouch.UIKit.UIImage>Monotouch.UIKit.UIImage

[找到了解决方案] 问题出在
obj.Image = await this.LoadImage(imageUrl)
必须在一个标记为 async 的方法中执行。这样就可以解决问题了!

谢谢


0

以下代码应该可以正常工作,

public static async Task<UIImage> LoadImage(string imageUrl)
{
            var httpClient = new HttpClient();

            var contents = await httpClient.GetByteArrayAsync(imageUrl);
            return UIImage.LoadFromData(NSData.FromArray(contents));
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接