如何在独立存储中保存 Web 中的图像

本文关键字:保存 Web 图像 存储 独立 | 更新日期: 2023-09-27 18:33:01

在我的应用程序中,我有图像的URL列表。我需要做的是下载这些图像并将它们保存在独立存储中。

我已经拥有的:

using (IsolatedStorageFile localFile = IsolatedStorageFile.GetUserStoreForApplication()) {
...
foreach (var item in MyList)
{
    Uri uri = new Uri(item.url, UriKind.Absolute);
    BitmapImage bitmap = new BitmapImage(uri);
    WriteableBitmap wb = new WriteableBitmap(bitmap);
    using (IsolatedStorageFileStream fs = localFile.CreateFile(GetFileName(item.url)))//escape file name
    {
        wb.SaveJpeg(fs, wb.PixelWidth, wb.PixelHeight, 0, 85);
    }
}
...
}

这段代码在我的App.xaml.cs文件中有它的内部函数。我已经尝试了很多解决方案,在这个解决方案中,问题是"无效的跨线程访问"。

我怎样才能让它工作?

如何在独立存储中保存 Web 中的图像

如果在非 UI 线程上创建WriteableBitmap,则会获得无效的跨线程访问。通过使用Dispatcher确保该代码在主线程上运行:

Deployment.Current.Dispatcher.BeginInvoke(() =>
    // ...
);

此问题的解决方案是:

foreach (var item in MyList)
{
    Uri uri = new Uri(item.url, UriKind.Absolute);
    HttpWebRequest request = HttpWebRequest.Create(uri) as HttpWebRequest;
    request.BeginGetResponse((ar) =>
    {
        var response = request.EndGetResponse(ar);
        Deployment.Current.Dispatcher.BeginInvoke(() =>
        {
            using (var stream = response.GetResponseStream())
            {
                var name = GetFileName(item.url);
                if (localFile.FileExists(name))
                {
                    localFile.DeleteFile(name);
                }
                using (IsolatedStorageFileStream fs = localFile.CreateFile(name))
                {
                    stream.CopyTo(fs);
                }
            }
        });
    }, null);
}

@Mateusz Rogulski

您应该使用WebClient,我建议您遵循针对您的问题的解决方案。

 public string YourMethod(string yoursUri)
 {
    BitmapImage image=new BitmapImage();
    WebClient client = new WebClient();
    client.OpenReadCompleted += async (o, args) =>
    {
        Stream stream = new MemoryStream();
        await args.Result.CopyToAsync(stream);
        image.SetSource(stream);
    };
    client.OpenReadAsync(new Uri(yoursUri));//if passing object than you can write myObj.yoursUri
    return image;
}

现在您有了图像,您可以在调用此函数的任何地方使用有效检查保存到隔离存储中