如何在互联网上显示来自 json url 的图像

Posted

技术标签:

【中文标题】如何在互联网上显示来自 json url 的图像【英文标题】:How to display an image from a json url on the internet 【发布时间】:2020-08-02 19:51:42 【问题描述】:

这里有新的 xamarin 程序员。我需要使用 URL 显示来自 Internet 的漫画图像,但不知何故,系统一直告诉我指向 url 的链接不起作用,但我不知道为什么当我实例化一个新的 UriImageSource 时。

我的第一种方法是尝试使用 BitMapImage 显示图像,但它仅适用于 WindowsForms 或 WPF,因此如果 UriImageSource 不适合我,我也需要替代方法。顺便说一句,我在 Mac 上。

这是 xaml:

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="Weather_App.MainPage"> 
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>
        <StackLayout Grid.Row="1" Orientation="Horizontal" HorizontalOptions="Center">
            <Image x:Name="backgroundImage" Margin="20"/>

        </StackLayout>
    </Grid>
</ContentPage>

这是 MainPage.cs:

using Xamarin.Forms;

namespace Weather_App

    // Learn more about making custom code visible in the Xamarin.Forms previewer
    // by visiting https://aka.ms/xamarinforms-previewer
    [DesignTimeVisible(false)]
    public partial class MainPage : ContentPage 
    
        private int maxNumber = 0;
        private int currentNumber = 0;

        public MainPage()
        
            InitializeComponent();
            ViewModel.ApiHelper.InitializeClient();

            string url = Convert.ToString(ComicProcessor.LoadComic());
            backgroundImage.Source = new UriImageSource
            
                Uri = new Uri(url),
                CachingEnabled = false,
                CacheValidity = TimeSpan.FromHours(1)
            ;

        
    

最后,这是 viewmodel/LoadComic 方法。我最初尝试返回漫画而不是 url,但由于 Mac 不存在 BitMapImage,所以我返回了 url,因为我认为我可以将它用于 UriImageSource 实例。漫画属性包括一个整数 Num 和一个字符串 Img。

namespace Weather_App

    public class ComicProcessor
    
        public static int MaxComicNumber  get; set; 
        public async static Task<string> LoadComic(int comicNumber = 0)
        
            string url = "";
            if (comicNumber > 0)
            
                url = $"https://xkcd.com/comicNumber/info.0.json";
            
            else
            
                url = $"https://xkcd.com/info.0.json";
            

            using (HttpResponseMessage response = await ViewModel.ApiHelper.ApiClient.GetAsync(url))
            
                if (response.IsSuccessStatusCode)//If response successful do something then
                
                    // Takes data in as json and converted it to the type you have given and match anything that it finds 
                    ComicModel comic = await response.Content.ReadAsAsync<ComicModel>();

                    if (comicNumber == 0)
                    
                        MaxComicNumber = comic.Num;
                    

                    return url;
                
                else
                
                    // Outputs reason why it wasn't successful
                    throw new Exception(response.ReasonPhrase);
                

            


        
    

【问题讨论】:

【参考方案1】:

我建议您为此使用FFImageLoading's CachedImage。

这是一个被社区广泛接受的库,非常适合缓存,并且还具有内存处理选项。

您可以查看他们的Git wiki 以深入了解该库。

从Nuget下载它

在每个平台上致电CachedImageRenderer.Init()。让我们把它放在我们 android 项目的 MainActivity.csiosAppDelegate.cs 上。

然后添加它的命名空间并像这样使用它:

  <ffimageloading:CachedImage
                HorizontalOptions="Center" VerticalOptions="Center"
                DownsampleToViewSize="true"
                Source = "Binding ImageUrl">
        </ffimageloading:CachedImage>

Xamarin.Forms.Image 是一个选项,但我个人认为它不适用于 URL 图片。

也只需将 CachedImage 的 URL 提供给它,它就会为您完成下载!

祝你好运,

如果您有任何问题,请随时回复。

【讨论】:

以上是关于如何在互联网上显示来自 json url 的图像的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React 中显示来自 JSON URL 数组的图像

来自 json url 的离子显示图像

Flutter:如何优先显示来自 Asset 的图像,如果找不到,则显示来自 URL 的图像?

在 Android(java) 中,如何使用 URL 而不是来自互联网的图像地址在 ImageView 中加载图像?

在tableview中显示来自json文件的图像

Flutter:如何使用来自URL的图像通过社交网络共享图像