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

Posted

技术标签:

【中文标题】从 Xamarin / C# 中的 URL 加载的 UIImage【英文标题】:UIImage loaded from URL in Xamarin / C# 【发布时间】:2013-07-23 04:23:20 【问题描述】:

this question 得到this blog post 的答复已经 4 年了。

是否有一种标准方法可以使用来自 URL 的图像创建 UIImage?比如:

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

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

【问题讨论】:

【参考方案1】:

不是单行,但您可以自己滚动几行。例如

static UIImage FromUrl (string uri)

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

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

【讨论】:

当我使用 google.ca/images/srpr/logo11w.png 之类的 url 尝试此操作时,我得到“无法初始化 'MonoTouch.Foundation.NSUrl' 类型的实例:本机 'initWithString:' 方法返回 nil。”知道为什么会这样吗? NSUrl 将抛出(在 ObjC 中返回 nil)然后提供的 URL 无效(不符合 RFC 2396)。见苹果文档@developer.apple.com/library/ios/documentation/Cocoa/Reference/…:【参考方案2】:

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

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

【讨论】:

byte[] 内容 = 等待 httpClient.GetByteArrayAsync (imageUrl);【参考方案3】:

您要确保异步加载图像,以免阻塞 UI 线程。 MonoTouch.Dialog 包含一个您可以使用的ImageLoader(参见第 5.3 节)类。

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

最后,如果您想手动操作,可以使用Xamarin Recipe。

【讨论】:

【参考方案4】:

我尝试了上述方法,这看起来是个好主意,但我得到了: 无法隐式转换类型System.Threading.Tasks.Task&lt;MonoTouch.UIKit.UIImage&gt;' toMonotouch.UIKit.UIImage'

[找到解决方案] 问题是因为 obj.Image = 等待 this.LoadImage (imageUrl) 还必须在标记为异步的方法中。 然后就可以了!

谢谢

【讨论】:

【参考方案5】:

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

public static async Task<UIImage> LoadImage(string imageUrl)

            var httpClient = new HttpClient();

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

【讨论】:

以上是关于从 Xamarin / C# 中的 URL 加载的 UIImage的主要内容,如果未能解决你的问题,请参考以下文章

C# 文件(CodeBehind 类)从 Visual Studio 中的项目中消失 - Xamarin

关于使用 C#(Xamarin 开发环境)从浮点矩阵转换为 Java.Lang.Object 的问题

如何从 Xamarin MacOS 开发中的另一个 C# 文件更新 ViewController.cs 中的“标签”?

如何从 Xamarin.forms pcl 中的 Url 检索 json 字符串

如何从 Xamarin.forms pcl 中的 Url 检索 json 字符串

Xamarin Android C# 中的进度条和线程